0

libpcap으로 패킷을 캡처하려고합니다.Libpcap이 전체 패킷을 캡처하지 않습니다.

int main (int argc, char **argv) { 
    char *dev = "eth0"; 
    char errbuf[PCAP_BUFFER_SIZE]; 
    pcap_t *handle; 

    char filter[] = "tcp and src port 80"; 
    struct bpf_program fp; 
    bpf_u_int32 mask, net; 

    handle = pcap_open_live(dev, SNAP_LEN, 1, 1000, errbuf); 
    pcap_compile(handle, &fp, filter,0,net); 
    pcap_setfilter(handle, &fp); 
    pcap_loop(handle, -1, got_packet, NULL); 

    pcap_freecode(&fp); 
    pcap_close(handle); 

    return 0; 
} 

그리고

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { 
    static int count = 1; 
    static int http_count = 1; 
    const struct sniff_ethernet *ethernet; 
    const struct sniff_ip *ip; 
    const struct sniff_tcp *tcp; 

    int size_ip; 
    int size_tcp; 
    int size_payload; 

    count++; 

    ethernet = (struct sniff_ethernet*) (packet); 
    ip = (struct sniff_ip*) (packet + SIZE_ETHERNET); 
    size_ip = IP_HL(ip)*4; 
    if (size_ip < 20){ 
     printf("Invalid IP header %d", size_ip); 
     return; 
    } 

    if (ip->ip_p != IPPROTO_TCP){ 
     printf("Not TCP\n"); 
     return; 
    } 

    tcp = (struct sniff_tcp*) (packet +SIZE_ETHERNET+size_ip); 
    size_tcp = TH_OFF(tcp) * 4; 
    if (size_tcp < 20) { 
     printf("Invalid TCP header"); 
     return; 
    } 

    if ((tcp->th_flags & TH_ACK) != 0) { 
     const char *payload = (const char *) (packet + SIZE_ETHERNET + size_ip + size_tcp); 
     size_payload = ntohs(ip->ip_len)- (size_ip + size_tcp); 
     std::cout << payload << "\n";  
     if (count == 4) 
      exit(0); 
    } 

매개 변수는 다음과 같습니다 :

#define SNAP_LEN 65535 
#define SIZE_ETHERNET 14 
#define ETHER_ADDR_LEN 6 
#define PCAP_BUFFER_SIZE 65535 

은 이제 네 번째 패킷의 전체가 인쇄되지 않습니다 여기 내 코드입니다. tcpdump을 사용하여 패킷을 버리고 전체 패킷을 가져 오지만 내 코드는 가져 오지 않습니다. 여기 뭔가 잘못 됐니?

답변

0

인쇄시 문제가있는 것으로 나타났습니다. 내가 함수 print_payload을 사용하고 지금은 잘 작동합니다.

관련 문제