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]