2012-03-29 2 views
0

私は、ネットワーク上でパケットを受信するアプリケーションを持っています。私はペイロード(データ)セクション以外のすべてのフィールド値を解釈することができます。ネットワーク上で受信したデータ(パケットペイロード)のコピー

パケット構造を考慮してください: src addr | srcポート|宛先アドレス| |データ|チェックサム

パケット自体がchar *として格納され、src/des addr、portのすべての値を取得できます。しかし、ペイロードセクションは私を混乱させます。私は16進形式で印刷することができますが、charで印刷するとASCII以外の値が得られます。ペイロードセクションを新しい文字列にコピーして新しい文字列を印刷すると、何も得られません。つまり、何も印刷されず、その長さは0です。エラーや警告が表示されません。私はどこに間違っているか教えてもらえますか?私はここで何かを逃していると思う。

typedef struct pcap_802_15_4_s{ 
    guint16 fcf; 
    unsigned char seqno; 
    guint16 dpan; 
    guint16 daddr; 
    guint16 saddr; 
    char *payload_data; 
    } pcap_802_15_4_t; 


char *packet = read_serial_packet(src, &len); 


     if (!packet) 
    exit(0); 
     else if (packet[0] != TOS_SERIAL_802_15_4_ID) { 
    printf("bad packet (serial type is %02x, not %02x)\n", packet[0], TOS_SERIAL_802_15_4_ID); 
     } 

     plen = packet[1]; 
     printf("Received packet of length %i: \n", plen); 
     if (plen != len) { 
    printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen, len); 
     } 

     struct timeval tv;  
     gettimeofday(&tv, NULL); 


     i = 2; 
     // Read in FCF and i+=2 
     fcf = packet[i+1] << 8 | packet[i]; 
     packet_802_15_4.fcf = fcf; 
     i += 2; 


     { 
    if ((fcf & 0x7) == 0x01) { 
     printf(" Frame type: data\n"); 
    } 
    else if ((fcf & 0x7) == 0x02) { 
     printf(" Frame type: acknowledgement\n"); 
    } 
    else { 
     printf(" Frame type: other\n"); 
    } 

    printf(" Security: %s\n", (fcf & (1 << 3)) ? "enabled":"disabled"); 
    printf(" Frame pending: %s\n", (fcf & (1 << 4)) ? "yes":"no"); 
    printf(" Ack request: %s\n", (fcf & (1 << 5)) ? "yes":"no"); 
    printf(" Intra-PAN: %s\n", (fcf & (1 << 6)) ? "yes":"no"); 
    intraPan = (fcf & (1 << 6)); 
     } 


     { 
    unsigned char seqno = packet[i++]; 
    packet_802_15_4.seqno = seqno; 
    printf(" Sequence number: 0x%hhx\n", seqno); 
    printf(" Sequence number(dump): 0x%hhx\n", packet_802_15_4.seqno); 

     } 

     { 
    char addrLen = (fcf >> 10) & 0x3; 
    short saddr = 0; 
    long long laddr = 0; 

    // 16- and 64-bit destinations have a PAN ID 
    if (addrLen == 2 || addrLen == 3) { 
     short destPan = packet[i++] << 8 | packet[i++]; 
     packet_802_15_4.dpan = destPan; 
     printf(" Destination PAN: 0x%02hx\n", destPan); 
     printf(" Destination PAN (dump): 0x%02hx\n", packet_802_15_4.dpan); 
    } 

    switch (addrLen) { 
    case 0: 
     printf(" Destination address: none\n"); 
     break; 
    case 1: 
     printf(" Destination address: invalid? (0x01)\n"); 
     break; 
    case 2: 
     saddr = (packet[i] << 8 | packet[i+1]); 
     i += 2; 
     packet_802_15_4.daddr = saddr; 
     printf(" Destination address: 0x%04hx\n", saddr); 
     printf(" case 2: Destination address(dump): 0x%04hx\n", packet_802_15_4.daddr); 
     break; 
    case 3: { 
     int j; 
     for (j = 0; j < 8; j++) { 
     laddr = laddr << 8; 
     laddr |= packet[i++]; 
     } 
     packet_802_15_4.daddr = saddr; 
     printf(" Destination address: 0x%016llx\n", laddr); 
     printf(" case 3: Destination address(dump): 0x%016llx\n", (long long unsigned int)packet_802_15_4.daddr); 
     break; 
    } 
    default: 
     printf(" Destination address: parse serror\n"); 
    } 
     } 


     { 
    char addrLen = (fcf >> 14) & 0x3; 
    short saddr = 0; 
    long long laddr = 0; 

    if (!intraPan) { // Intra-PAN packet 
     short srcPan = packet[i] << 8 | packet[i+1]; 
     //packet_802_15_4.span = srcPan; 
     i += 2; 
     printf(" Source PAN: 0x%02hx\n", srcPan); 
    } 

    switch (addrLen) { 
    case 0: 
     printf(" Source address: none\n"); 
     break; 
    case 1: 
     printf(" Source address: invalid? (0x01)\n"); 
     break; 
    case 2: 
     saddr = (packet[i] << 8 | packet[i + 1]); 
     packet_802_15_4.saddr = saddr; 
     i += 2; 
     printf(" case(2): Source address: 0x%04hx\n", saddr); 
     break; 
    case 3: { 
     int j; 
     for (j = 0; j < 8; j++) { 
     laddr = laddr << 8; 
     laddr |= packet[i++]; 
     } 
     printf(" case(3): Source address: 0x%016llx\n", laddr); 
     packet_802_15_4.saddr = saddr; 
     break; 
    } 
    default: 
     printf(" Source address: parse serror\n"); 
    } 
     } 

     if (iframes) { 
    printf(" I-Frame: %s\n", (packet[i++] == 0x3f)? "yes":"no"); 
     } 

     printf(" AM type: 0x%02hhx\n", packet[i++]); 

     if (i >= plen) { 
    printf("Packet format error: read packet is shorter than expected.\n"); 
     } 
     else { 
     int j=0; 
    packet_802_15_4.payload_data = (char *)malloc(sizeof(char) * (plen - i)); 
    for (; i < plen; i++) { 
     printf("Payload byte %d: 0x%02hhx \n",i,packet[i]); 
     printf("Payload byte %d: %c \n",i,packet[i]); 
     packet_802_15_4.payload_data[j] = (char) packet[i]; 
     j++; 
    } 

ペイロードの六角出力: 0x00の 0x01の 0x10の 0xdd

+0

バイナリデータの場合は、ペイロードを文字列として扱うように思えます。ペイロードの16進版はどのように見えますか? – John3136

+0

ペイロード(16進数):0x00 0x01 0x10 0xdd – broun

+0

ペイロードはどのようなものですか? – John3136

答えて

0

1)あなたはWiresharkのを持っている場合は、いくつかのパケットをキャプチャして確認してください。ここ

は、コードのセクションですそこにペイロード表現。 Wiresharkがあなたのペイロードを正しく表示するならば、コードのレシーバ部分は問題になるはずです。

2)IPヘッダーまたはTCPヘッダーがありませんか?生のイーサネットを転送していますか?

3)ペイロードは文字以外何もないですか?

+0

これはIPパケットではありません。これはIEEE 802.15.4であり、パケット構造は大まかなものです。私はそれを簡単に保つためにいくつかのフィールドを変更しました。 – broun

+0

同じ文字列+すべての0パディングを常に転送するシナリオがありますか?パケットを解析する際にバグがあると、asciiをマッチングさせることで、インデックス+オフセットの問題を解決できるでしょうか?すべての文字「AAAAA」+ゼロ埋め込みを送信しているとしましょう。0x41 0x41 0x41 0x41 .... – tartar

+0

また、WiresharkはTinyOS 802.15.4フレームのAm抽象レイヤーを解読しません。だからそれで確認できませんでした。 – broun

関連する問題