4

libpcap を使用して IPv6 パケットを盗聴し、それらのパケットを TCP/IP 経由でサーバーに送信するプログラムを作成しています。

IP(v6) パケットはマルチバイト データではなく、「ビットの集まり」に似ているため、マーシャリング (htons など) は使用しません。

奇妙なことに、パケットを stdout に出力すると問題なく見えますが、ネット経由で送信すると、すべてごちゃごちゃになります。サーバーに問題がないことを確認するために netcat を使用しました。1 つのパケットは正しく到着しましたが、もう 1 つのパケットのバイト順は異なります。理由はありますか?

編集:OK、素晴らしい「nos」は正しかったので、hexdumpにだまされました。「hexdump -c」は正しい出力を示します。ただし、私のプログラムのサーバー部分 (正直なところ、送信者/クライアントほど愛されていないので、ここにコードを投稿する前に書き直します) は、2 回の読み取りを行い、正しいデータを取得し、ほとんどのデータを取得します。時間はすべてを一度に取得し、順序をごちゃ混ぜにします。

(送信) コード:

struct pb_elem {
    size_t size;
    u_char *data;
};
-------------------------    

int send_all(int sockfd, packet_buf pbuf) {
int res = 0, n, i;
uint offset = 0, byteleft = 0;
struct pb_elem *packet;

res = packet_buf_dequeue(pbuf, &packet);
while (res == 0) {
    byteleft = packet->size;
    offset = 0;

    /* DEBUG */ fprintf(stderr, "DEBUG: send new packet\n");
    printf("DEBUG: Data size: %zu\n", packet->size);
    for (i=0; i < packet->size; i++) {
        printf(((i % 2 == 1) ? "%02X " : "%02X"), (unsigned int)*(packet->data+i));
    }
    printf("\n");

    do {
        n = send(sockfd, packet->data+offset, byteleft, 0);
        if (n == -1)
            break;
        offset = n;
        byteleft -= n;
        /* DEBUG */ fprintf(stderr, "DEBUG: send: offset: %u, byteleft: %u\n", offset, byteleft);
    } while (byteleft > 0);

    if (n == -1)
        fprintf(stderr, "Error: could not send whole packet.");

    free(packet->data);
    free(packet);

    res = packet_buf_dequeue(pbuf, &packet);
}

return 0;
}

sniffer prog (送信者) からのサンプル出力 (2 つの ICMPv6 パケット):

IPv6Buffer started
DATA:
0800 277B 1EBD 0A00 2700 0001 86DD 6000 0000 0035 3A40 2001 0DB8 BBBB 0000 0000 0000 0000 0001 2001 0DB8 BBBB 0000 0000 0000 0000 0102 8000 160B 116F 0001 09BD B450 0000 0000 DD2A 0500 0000 0000 CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CA
DATA:
0800 277B 1EBD 0A00 2700 0001 86DD 6000 0000 0035 3A40 2001 0DB8 BBBB 0000 0000 0000 0000 0001 2001 0DB8 BBBB 0000 0000 0000 0000 0102 8000 3E08 116F 0002 0ABD B450 0000 0000 B42C 0500 0000 0000 CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CA
DEBUG: start_sending
DEBUG: Data size: 107
0800 277B 1EBD 0A00 2700 0001 86DD 6000 0000 0035 3A40 2001 0DB8 BBBB 0000 0000 0000 0000 0001 2001 0DB8 BBBB 0000 0000 0000 0000 0102 8000 160B 116F 0001 09BD B450 0000 0000 DD2A 0500 0000 0000 CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CA
DEBUG: Data size: 107
0800 277B 1EBD 0A00 2700 0001 86DD 6000 0000 0035 3A40 2001 0DB8 BBBB 0000 0000 0000 0000 0001 2001 0DB8 BBBB 0000 0000 0000 0000 0102 8000 3E08 116F 0002 0ABD B450 0000 0000 B42C 0500 0000 0000 CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CA

サーバー/レシーバープログラムで受け取るもの:

IPv6Buffer started
DEBUG: start_receiving()
DEBUG: pre-accept in receive_data()
Data size: 214
0800 277B 1EBD 0A00 2700 0001 86DD 6000 0000 0035 3A40 2001 0DB8 BBBB 0000 0000 
0000 0000 0001 2001 0DB8 BBBB 0000 0000 0000 0000 0102 8000 2598 1280 0001 B3C8 
B450 0000 0000 2381 0400 0000 0000 CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE CAFE 
CAFE CAFE CAFE CAFE CAFE CA08 0027 7B1E BD0A 0027 0000 0186 DD60 0000 0000 353A 
4020 010D B8BB BB00 0000 0000 0000 0000 0120 010D B8BB BB00 0000 0000 0000 0001 
0280 007A 9712 8000 02B4 C8B4 5000 0000 00CD 8004 0000 0000 00CA FECA FECA FECA 
FECA FECA FECA FECA FECA FECA FECA FECA FECA FECA FECA
4

1 に答える 1