2012-04-23 11 views
2

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"は空です。このパケットを構築し、解析する方法について私に案内してください。

答えて

2
ptr = ptr + strlen(_name); 
memcpy(ptr, &counter, sizeof(u_short)); 

これは間違っています。ポインタstrlen(_name)の位置を前進させようとしているのは、正確に100を進めるべきときです。_nameu_char name[100]です。

サイドノート:

  • u_int lifetime;は4バイトであることが保証されていません。それにはuint32_tを使用してください。同じことがu_shortuint16_tを使用)

のstrlen(BUF)のために行くのパケットだけで、大きな文字列ではありませんので、パケット

の長さを返します(それはまた、非テキストデータが含まれています、例えばu_int lifetimestrlenを使用しても問題ありません。最初の0バイトで停止します。

+0

お返事ありがとうございます。 パケットの長さを100と200を長さに固定するのではなく、 'name'と' data'文字列の長さに基づいて可変にする方法がありますか? char [100]の代わりにchar *を使用しようとしましたが、パケットを構築するときにセグメント化エラーが発生します。 もう1つの問題は、私がrecvfromを実行すると、 'rval'がパケット全体の合計バイト数を返しても、' buf'はパケット全体を表示しないということです。私は 'name'文字列の後のゼロのために、' buf'は終了し、 'name'の最後までパケットを表示します。これをどうやって解決するのですか? – ddd

関連する問題