0

私は次のコードを持っています

int ParseData(unsigned char * packet、int len){struct ethhdr * ethernet_header; struct iphdr * ip_header; struct tcphdr * tcp_header; unsigned char * data; int data_len;

    /* Check if any data is there */

    if(len > (sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr)))
    {

            ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));


            data = (packet + sizeof(struct ethhdr) + ip_header->ihl*4 + sizeof(struct tcphdr));
            data_len = ntohs(ip_header->tot_len) - ip_header->ihl*4 - sizeof(struct tcphdr);

            if(data_len)
            {
                    printf("Data Len : %d\n", data_len);
                    PrintData("Data : ", data, data_len);
                    printf("\n\n");
                    return 1;
            }
            else
            {
                    printf("No Data in packet\n");
                    return 0;
            }
    }

}

私はASCIIでペイロードを印刷しようとしていますそしてこのような単純な関数で

PrintData(char * mesg、unsigned char * p、int len){printf(mesg);

    while(len--)
    {
            if(isprint(*p))
                    printf("%c", *p);
            else
                    printf(".");
            p++;
    }

}

コードは見栄えが良く、コンパイルの問題や警告はありません。問題は、最初のペイロード文字が位置0ではなく、12バイト後に印刷されることです。

すべての「len」バイトは、印刷する必要のある正確なデータだと思いました。

データのデータポイント=(packet + sizeof(struct ethhdr)+ ip_header-> ihl * 4 + sizeof(struct tcphdr)); ただし、data[0]は印刷できません。何が問題ですか?私は何かが恋しいですか?TCPオプションの部分をチェックする必要がありますか?

ありがとう

4

1 に答える 1

0

そうです、sizeof(struct tcphdr)を追加すると、オプションではなく、ヘッダーを通過するだけです。実際のデータを取得するには、TCPヘッダーの「offset」フィールドを使用する必要があります。オフセットはTCPヘッダーの先頭から計算され、4バイト単位です。たとえば、オフセットが8の場合、ヘッダー+オプションの長さは32です。

于 2010-02-21T17:00:42.903 に答える