I以下のパケットフォーマットがあります:私はWiresharkの中にパケットを盗聴構築と解析ネットワークパケット
int buildDataPacket(u_int _lifetime, u_char* _name, u_short _counter, u_char* _data, u_char* _dataPacket) {
Data *ndata=NULL;
u_char *ptr;
memset(_dataPacket, 0, 512);
ndata = (Data *) _dataPacket;
ndata->pkt_type = 2;
ndata->lifetime = htonl(_lifetime);
ndata->type = 2;
ndata->len_name = strlen(_name);
ptr = (u_char *)ndata + (3 * sizeof(u_char)) + sizeof(u_int);
strncpy((char *)ptr, (char *)_name, strlen(_name));
u_short counter = htons(_counter);
u_char datalen = strlen(_data);
ptr = ptr + strlen(_name);
memcpy(ptr, &counter, sizeof(u_short));
ptr = ptr + sizeof(u_short);
memcpy(ptr, &datalen, sizeof(u_char));
ptr = ptr + sizeof(u_char);
strncpy((char *)ptr, (char *)_data, strlen(_data));
ptr = ptr + strlen(_data);
return (ptr - (u_char *)_dataPacket);
}
int processDataPacket(u_char* _dataPacket, u_short _pktLen)
{
if (!_dataPacket || !_pktLen) {
return -1;
}
Data *dataPkt;
dataPkt = (Data *)_dataPacket;
printf("Lifetime: %d\n", ntohl(dataPkt->lifetime));
printf("Name: %s\n", dataPkt->name);
printf("Counter: %d\n", dataPkt->counter);
printf("Data: %s\n", dataPkt->data);
return 0;
}
、私が見つかりました。ここ
1B 4B 1B 1B string 2 bytes 1B string
+------+----------+---+--------+---~~--+---------+--------+---~~---+
| type | lifetime | 2 | length | Name | Counter | length | Data |
+------+----------+---+--------+---~~--+---------+--------+---~~---+
typedef struct pkt_data {
u_char pkt_type;
u_int lifetime;
u_char type;
u_char len_name;
u_char name[100];
u_short counter;
u_char len_data;
u_char data[200];
}__attribute__((__packed__)) Data;
がパケットを構築し、解析するためのコードです。パケットの構成はフォーマットに従うこと。しかし、 "counter"と "len_data"の値は、私がそれに応じて設定してもゼロです。また、パケットを受信すると、フルパケットはバッファに格納されません。
rval=recvfrom(inet_sock, buf, BUFLEN-1, MSG_DONTWAIT, (struct sockaddr *) &dest_sin, &socklen);
buf[rval]=0;
fprintf(stderr, "Received: %d (%d) bytes containing %s", rval, strlen(buf), buf);
'rval'は正しいバイト数を返しますが、「buf」は「name」の後に終了します。 strlen(buf)はパケットの長さをその名前までだけ返します。したがって、processDataPacketでは "data"は空です。このパケットを構築し、解析する方法について私に案内してください。
お返事ありがとうございます。 パケットの長さを100と200を長さに固定するのではなく、 'name'と' data'文字列の長さに基づいて可変にする方法がありますか? char [100]の代わりにchar *を使用しようとしましたが、パケットを構築するときにセグメント化エラーが発生します。 もう1つの問題は、私がrecvfromを実行すると、 'rval'がパケット全体の合計バイト数を返しても、' buf'はパケット全体を表示しないということです。私は 'name'文字列の後のゼロのために、' buf'は終了し、 'name'の最後までパケットを表示します。これをどうやって解決するのですか? – ddd