1

RAW ソケットを使用して、IP および UDP ヘッダーを含むパケットを受信するためのこの単純なコードを作成しました。RAW ソケット経由で UDP パケットを送信するテスト アプリでは問題なく動作します。ここで、pcap ファイルを使用してコードをテストします。Ostineto ユーティリティを使用して、単純な IP/UDP パケットを作成しました。私の場合、eth1経由で送信しています。送信元と送信先の MAC および IP アドレスは、このパケットで同じです。Wireshark はこれをキャプチャでき、すべて問題ないように見えます。しかし、私の RAW ソケットは受信しません。これは本当に私のさらなる発展を妨げています。助けてください。

ところで、これを Ubuntu 12.04 でテストしています。

これが私のコードです

int main(void)
{
    int s, bytesrecvd;
    struct sockaddr_in saddr;
    char packet[100];
    char *payload;

    if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) < 0) {
    perror("error:");
    exit(EXIT_FAILURE);
    }


    memset(packet, 0, sizeof(packet));
    int fromlen = sizeof(saddr);

    while(1) {
        bytesrecvd = recvfrom(s, (char *)&packet, sizeof(packet), 0,
                             (struct sockaddr *)&saddr, (socklen_t *)&fromlen);
        if(bytesrecvd < 0) {
            perror("packet receive error:");
        }
        printf("bytes received %d\n",bytesrecvd);

        parse_ip_header(packet, bytesrecvd);
        parse_udp_header(packet, bytesrecvd);

        payload = packet + sizeof(struct iphdr) + sizeof (struct udphdr);
        printf("payload: %s\n", payload);
    }

    return 0;
}

Stackoverflow では画像を投稿できませんでした。それ以外の場合は、ostinato のスクリーンショットとパケットの内容をレビュー用に共有するつもりでした。

ここにpcapのテキストがあります

Frame 1: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
WTAP_ENCAP: 1
Arrival Time: Dec 31, 1969 18:00:00.000000000 CST
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 0.000000000 seconds
[Time delta from previous captured frame: 0.000000000 seconds]
[Time delta from previous displayed frame: 0.000000000 seconds]
[Time since reference or first frame: 0.000000000 seconds]
Frame Number: 1
Frame Length: 60 bytes (480 bits)
Capture Length: 60 bytes (480 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ip:udp:data]
Ethernet II, Src: HewlettP_72:2e:08 (ac:16:2d:72:2e:08), Dst: HewlettP_72:2e:08     (ac:16:2d:72:2e:08)
Destination: HewlettP_72:2e:08 (ac:16:2d:72:2e:08)
    Address: HewlettP_72:2e:08 (ac:16:2d:72:2e:08)
    .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Source: HewlettP_72:2e:08 (ac:16:2d:72:2e:08)
    Address: HewlettP_72:2e:08 (ac:16:2d:72:2e:08)
    .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
    .... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IP (0x0800)
Internet Protocol Version 4, Src: 10.1.15.47 (10.1.15.47), Dst: 10.1.15.47 (10.1.15.47)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-  Capable Transport))
    0000 00.. = Differentiated Services Codepoint: Default (0x00)
    .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport)   (0x00)
Total Length: 46
Identification: 0x04d2 (1234)
Flags: 0x00
    0... .... = Reserved bit: Not set
    .0.. .... = Don't fragment: Not set
    ..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 127
Protocol: UDP (17)
Header checksum: 0x048e [correct]
    [Good: True]
    [Bad: False]
Source: 10.1.15.47 (10.1.15.47)
Destination: 10.1.15.47 (10.1.15.47)

ユーザー データグラム プロトコル、送信元ポート: 0 (0)、宛先ポート: 0 (0) 送信元ポート: 0 (0) 宛先ポート: 0 (0) 長さ: 26 チェックサム: 0x0000 (なし) [正常なチェックサム: False]

4

0 に答える 0