0

私はpcapを使用して、httpの要求と応答を監視しています。pcap_loopを設定し、コールバック関数でパケットを取得していますが、パケットの内容を読み取る方法がわかりません。これは私のコールバック関数です:

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
     printf("%s\n", packet);
}

出力は常に一連のバックスラッシュとその後の3つの数字のように見えます

\ 200 \ 205 \ 300

httpリクエストとレスポンスを見つけて処理できるように、コンテンツを読みやすくするにはどうすればよいでしょうか。

アップデート:

私の目標はHTTPリクエストとレスポンスを読み取ることです。これを行うための適切で適切な方法はありますか?

4

2 に答える 2

4

これは、出力がASCII文字列ではなく生のバイナリデータであるため、printfは最初の0バイトまでしか出力しないためです。パケット内のすべての読み取り可能なものを印刷するには、次のようなものを使用します。

for (int i = 0; i < header->caplen; ++i) {
    if (isascii(packet[i])) {
      putchar(packet[i]);
    } else {
      putchar('.');
    }
于 2012-09-27T20:53:23.447 に答える
2

Libpcapは、すべてのヘッダーを含む生のパケットを提供します。必要なデータをそこから抽出する必要があります。パケットを表す標準の構造体にキャストすることをお勧めします。何かのようなもの、

/* Start with the ether header */
ethernet = (struct ether_header *) packet;

/* Do a couple of checks to see what packet type we have */
if (ntohs (ethernet->ether_type) == ETHERTYPE_IP)
{
            // Cast it to an IP packet struct
    ip_hdr = (struct ip*)(packet + sizeof(struct ether_header));

    //If TCP...
    if(ip_hdr->ip_p == 6)
    {
               packet_info.tcp_hdr = *(struct tcphdr*)((char*)ip_hdr + sizeof(struct ip));
               // Work on extracting the actual data for HTTP stuff over here
于 2012-09-27T21:04:21.430 に答える