4

UDP 経由で送信されるパケットを作成しようとしています。ただし、受信側で正しいデータを取得できません。

パケットには、IP ヘッダー、UDP ヘッダー、および送信する必要があるデータを含めたいと考えています。この場合、ランダムなヘッダー情報とともに「Hello」という単語を送信したいだけです。

char *data = "Hello";
char *packet = (char *)malloc(sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data));
struct iphdr *ip = (struct iphdr*) packet;
struct udphdr *udp = (struct udphdr*) (packet + sizeof(struct iphdr));
char *send_buff = (char *) (packet + sizeof(struct iphdr) + sizeof(struct udphdr));
ip->saddr = inet_addr("1.2.3.4");
ip->daddr = inet_addr("5.6.7.8");
ip->ttl = 5;
udp->source = 5950;
udp->dest = 5950;
udp->len = sizeof(struct udphdr);
udp->check = 0;
strcpy(send_buff, data);

sendto(sock, packet, (sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data)), ROUTER_IP);

私が抱えている問題は、受信側がランダムなデータを取得するだけなので、バイト数がどこかで間違っていると想定しています。

受信側で、IP ヘッダーのフィールドの 1 つをテストとして出力するようにしましたが、正しくありません。

char recv_buff[1000];
int recv_bytes = recvfrom(sock, recv_buff, sizeof(recv_buff));
struct iphdr *ip = (struct iphdr*) recv_buff;
cout << static_cast<int16_t>(ip->ttl) << endl;

パケットを間違ってまとめているのでしょうか、それとも受信側に問題がありますか? この例http://www.winlab.rutgers.edu/~zhibinwu/html/c_prog.htmを参考にして、パケットをまとめました。

4

3 に答える 3

2

socket(AF_INET, SOCK_DGRAM, 0);データグラム (=UDP、通常) ソケットであることを意味するソケットを作成しているため、ネットワークスタックには IP ヘッダーと UDP ヘッダーなどが自動的に含まれます。

しかし、独自の IP および UDP ヘッダーを作成しようとしているので、未加工のソケットを作成してから、パケットを送信する必要があります (参照コードが行っているようにチェックサムも計算します)。

raw ソケットを作成するには、 を使用しますsocket(AF_INET, SOCK_RAW, 0)

于 2012-11-29T05:52:13.547 に答える
1

生のソケットを使用しないという問題に加えて、ポート番号などを正しく設定しません。はネットワークのバイト順である必要があるため、そのためには eghtonsを使用する必要があります。ネットワーク バイト オーダーにする必要がある他のフィールドもあります。

于 2012-11-29T08:01:33.363 に答える
0

スタックの上部で独自のipヘッダーとudpヘッダーを使用している場合は、自分とスタックの両方のヘッダーを削除した後、データを解析していることを願っています。受信ソケットがRAWの場合、スタックのipヘッダーとudpヘッダーも取得します。

于 2012-11-30T07:05:31.813 に答える