2

そこで、最近 libpcap をいじっていて、簡単な質問があります。問題のコードは次のとおりです。

while( (result = pcap_next_ex(adapterHandle, &header, &packetData)) >= 0)
{
    if(result == 0) // Packet was dropped
        continue;


    ethernet = (struct sniff_ethernet*)packetData;
    ip = (struct sniff_ip*)(packetData + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    ip_len = ntohs(ip->ip_len);

    if(ip->ip_p != IPPROTO_TCP)
        continue;

    tcp = (struct sniff_tcp*)(packetData + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if(size_tcp < 20)
    {
        cout << "Invalid TCP Header" << endl;
        exit(-1);
    }

    payload = (u_char*)(packetData + SIZE_ETHERNET + size_ip + size_tcp);
    size_payload = ip_len - (size_ip + size_tcp);

    cout << "************** Output A ******************" << endl;
    cout << payload << endl;
    cout << "*************** Output B *****************" << endl;
    for(int i=0; i<size_payload; i++)
        cout << payload[i];
}

したがって、私のテストでは、HTTP「GET」リクエストのみをキャプチャするように設定しました。私の考えでは、出力 A と出力 B の出力は同じで、HTTP ヘッダーのみを出力する必要があります。出力 B は常に正しく出力されますが、出力 A には HTTP ヘッダーと約 7 バイトのランダム テキストが追加されることがあります (この「ï╤↔N↓ƒ♂」のように)。

問題は、その文字化けしたテキストがどこから来たのかということです。出力 A のようにペイロードを直接出力するのと、出力 B のようにループして各文字を出力するのとでは、何が違うのでしょうか?

4

1 に答える 1

2

NUL-terminated ( ) でなければ、どこで止めればよいの\0かわからないので、ガベージ テキストを出力します。あなたがしたいかもしれません:

payload[size_payload] = '\0'; /* Before using it. */
于 2011-07-13T17:19:45.660 に答える