0

我正在开发一个软件,它从我拥有的虚拟机中捕获通过我的防火墙(5.4 OpenBSD 虚拟机)的每个 udp 数据包,并将数据包保存在 MySQL 数据库中。

我的代码基本上是:

try
{
DatagramSocket serverSocket = new DatagramSocket(9876);        
byte[] receiveData = new byte [1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "INSERT INTO tabela_netflow (fluxo) values (?)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setBytes(1,receivePacket.getData());
int row = statement.executeUpdate();
if (row > 0) 
{
   System.out.println("Packet saved:" +receivePacket.getData());
}

} catch (SQLException ex) 
{
   ex.printStackTrace();
}

代码工作得很好,我的问题是当我尝试查看保存在数据库中的内容时,有很多奇怪的字符,因为它是二进制的(我认为),我无法读取它来获取我需要的信息(流量记录格式,可以在这里查看

我的表很简单:有 2 列,代码(int,自动增量)和另一列,fluxo(varbinary(10000))。这是我在 MySQL Workbench 上单击“在编辑器中打开值”时看到的内容: 数据包内容

4

2 回答 2

0

您可以使用以下命令将无符号字节转换为 int:

public static int unsignedByteToInt(byte b) {
    return (int) b & 0xFF;
}

这将返回字节的整数值。但是,您正在寻找来自 byte[0-1] 的值对吗?您将对这些值求和,这是一种非常快速的(可能是可怕的做法):

public static int unsignedByteToInt(byte[] b, int offset, int len) {
    int r = 0;
    for(int i = 0; i < len; i++){
        r += unsignedByteToInt(b[offset+i]);// the method shown earlier
    }
    return r;
}

给定一个 DatagramPacket 你可以调用:

int version = unsignedByteToInt(receivedDatagramPacketPacket.getData(), 0,2);

这是字符串的两种方法(顺便说一下,我没有测试过这些 :-\ ):

public static String byteToHex(byte b){
    int i = b & 0xFF;
    return Integer.toHexString(i);
}

public static String byteToHex(byte[] b, int offset, int len){
    String r = "";
    for(int i = 0; i < len; i++){
        r += byteToHex(b[offset+i]);
    }
    return r;
}

祝你好运 :)

于 2014-07-28T00:54:54.633 回答
0

NetFlow 5 数据报非常紧凑:每个字段只是一个数字。您最好在代码中将其解析出来,然后将带注释的字符串写入数据库,或者为 NetFlow 数据报中的每个字段添加数据库字段。

解析很简单:您只需计算字节数并将它们解释为整数或字符,具体取决于字段。

编辑:格式在这里:思科流记录格式它们列出了字节偏移量,因此如果您想要 dOctets(根据您的描述),请获取有效负载的 20-24 字节并将它们转换为整数。

于 2014-06-04T14:15:05.717 回答