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();
}

コードは正常に動作しています。私の問題は、データベースに保存されたコンテンツを表示しようとすると、奇妙な文字がたくさんあることです。これはバイナリ (だと思います) であるため、必要な情報を取得するために読み取ることができません。 (フロー レコード形式、ここで表示できます)

私のテーブルは非常に単純です。コード (int、自動インクリメント) の 2 つの列と、fluxo (varbinary(10000)) の列があります。これは、MySQL Workbench で「エディターで値を開く」をクリックすると表示されるものです。 パケット コンテンツ

4

2 に答える 2

0

NetFlow 5 データグラムは非常にコンパクトです。各フィールドは単なる数値です。コードでそれを解析し、注釈付きの文字列をデータベースに書き込むか、NetFlow データグラムの各フィールドにデータベース フィールドを追加することをお勧めします。

解析は簡単です。バイト数を数えて、フィールドに応じて整数または文字として解釈するだけです。

編集: フォーマットはここにあります:シスコ フロー レコード フォーマットバイト オフセットがリストされているため、dOctets が必要な場合 (説明したとおり)、ペイロードの 20 ~ 24 バイトを取得し、それらを整数に変換します。

于 2014-06-04T14:15:05.717 に答える
0

unsigned バイトを 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);

Strings の 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 に答える