我正在开发一个软件,它从我拥有的虚拟机中捕获通过我的防火墙(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();
}
代码运行得很好,我的问题是,当我尝试查看保存在数据库中的内容时,有很多奇怪的字符,因为它是二进制的(我认为),我无法读取它以获得我需要的信息(流量记录格式,可以被发送here)
我的表非常简单:有2列,代码(int,自动增量)和另一列,fluxo(varbinary(10000))。 这是我在MySQL Workbench上单击“编辑器中的打开值”时看到的内容: Packet Content
答案 0 :(得分:0)
NetFlow 5数据报非常紧凑:每个字段只是一个数字。最好在代码中解析出来并将带注释的字符串写入数据库或为NetFlow数据报中的每个字段添加数据库字段。
解析很简单:您只需计算字节数并将其解释为整数或字符,具体取决于字段。
编辑:格式在这里:Cisco Flow Record formats它们列出字节偏移量,所以如果你想要dOctets(根据你所描述的那样),取有效载荷的字节20-24并将它们转换为整数
答案 1 :(得分:0)
您可以使用以下符号将无符号字节转换为和
public static int unsignedByteToInt(byte b) {
return (int) b & 0xFF;
}
这将返回字节的Integer值。但是,您正在寻找字节[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);
以下是Strings的两种方法(顺便说一句,我没有测试过这些方法: - \):
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;
}
祝你好运:)