2009-03-25 28 views
12

Tôi cần một chương trình in số gói trong tệp chụp sử dụng pcap format. Con số này dường như không có sẵn trong tiêu đề pcap (có thể vì nó được viết trước khi bắt đầu chụp) và dường như không có "chân trang" trong tệp, với thông tin này.Lấy số gói trong tệp chụp pcap?

Vì vậy, tôi tin rằng thuật toán duy nhất là lặp qua tất cả các gói và tổng hợp chúng. Đó là trong O (N) và, cho các dấu vết lớn, khá dài.

Tôi đăng ở đây để xem ai đó có ý tưởng thông minh hơn không?

Tôi được gắn thẻ "C" vì đó là ngôn ngữ tôi hiện đang sử dụng nhưng tôi cho rằng đó là vấn đề độc lập về ngôn ngữ.

+0

"Con số này không dường như có sẵn trong tiêu đề pcap (có thể vì nó được viết trước khi bắt đầu chụp) và dường như không có "chân trang" trong tệp, với thông tin này."Vâng, đó là lý do tại sao nó không có trong tiêu đề (tập tin pcap có thể được viết vào một đường ống, vì vậy bạn không thể tìm lại và viết lại tiêu đề khi bạn đã hoàn thành), và không, không có chân trang. –

Trả lời

13

Robert Edmonds, tác giả của pcaputils, đã đề cập đến tôi rằng đã có một chương trình đang làm những gì tôi muốn, capinfos, trong gói Wireshark. Nó hiển thị các chỉ dẫn khác nhau về tệp pcap, bao gồm số lượng gói chứa.

Đọc nguồn mã, có vẻ như nó hoạt động bằng cách di chuyển toàn bộ tệp, theo tuần tự.

+0

Đó là chính xác nó hoạt động như thế nào. eshark có thể đọc một số định dạng tệp chụp khác nhau, bao gồm cả pcap và pcap-ng), đó là cách duy nhất nó có thể hoạt động, vì hầu hết các định dạng tệp không có số lượng gói ở đầu. –

+0

Để hiển thị số gói chính xác và không phải phiên bản có thể đọc được của con người, hãy thử lệnh sau: capinfos -Mc file.pcap | grep "Số" | tr -d "" | cut -d ":" -f 2 – schuess

1

Phương pháp duy nhất tôi biết là đọc tệp, khung được chụp bằng khung được chụp và tăng bộ đếm gói. Tuy nhiên, có một tiêu đề khung nhỏ chứa chiều dài của khung được lưu trữ, vì vậy bạn có thể tìm kiếm có thể không nhanh hơn nữa, bạn hãy nhớ rằng, bạn có thể nhớ nhanh hơn, hãy nhớ rằng bạn có thể nhanh hơn, hãy nhớ đến bạn

Tuy nhiên, nếu bạn muốn làm nhiều hơn là chỉ đếm số khung hình đã chụp. và xây dựng một chuỗi các khung hình được chụp trong khi đếm chúng, để sử dụng trong tương lai Thư viện PCAP của tôi cho Common Lisp thực hiện điều này. "điều hướng khung hình tiếp theo/trước", đọc thêm khung hình từ đĩa nếu cần. Tuy nhiên, việc phân tích cú pháp khung lều được để lại theo ý của người dùng thư viện và không được thực thi bằng cách đọc các octet khung vào cấu trúc dữ liệu.

+0

Trong C , không cần phải sử dụng "tiêu đề khung nhỏ có chứa chiều dài của khung được lưu trữ", pcap_next() làm điều đó cho bạn. – bortzmeyer

+0

Thư viện của bạn là http://www.suspicious.org/~night/plokami/? – bortzmeyer

+0

Thư viện của tôi có thể được tải xuống từ http://src.hexapodia.net/pcap.tar.gz.Tôi nghi ngờ sử dụng pcap_next() sẽ thực hiện một số phân tích khung và tha có thể làm cho mọi thứ chậm hơn một cách chậm chạp, một trong những lý do tôi chia nhỏ "đọc gói "từ" phân tích cú pháp gói ". – Vatine

4

Chỉ chỉ cách để xác định số lượng gói trong tệp là đọc toàn bộ tệp. Có, trên thực tế, không có số lượng gói trong tiêu đề tệp (vì định dạng được thiết kế để có thể ghi trong một lần truyền), và trên thực tế, không có chân trang.

2

Nếu bạn muốn số của Frames trong pcap:

tshark -r test.cap | wc -l 

Sử dụng capinfos:

capinfos test.cap | grep "Number of packets"| tr -d " " | cut -d ":" -f 2 

Sử dụng tcpdump:

tcpdump -r test.cap 2>/dev/null| wc -l 

Vì vậy, về cơ bản, sử dụng libpcap, đây là một ví dụ:

#include <stdio.h> 
#include <pcap.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    unsigned int packet_counter=0; 
    struct pcap_pkthdr header; 
    const u_char *packet; 

    if (argc < 2) { 
    fprintf(stderr, "Usage: %s <pcap>\n", argv[0]); 
    exit(1); 
    } 

    pcap_t *handle; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    handle = pcap_open_offline(argv[1], errbuf); 

    if (handle == NULL) { 
    fprintf(stderr,"Couldn't open pcap file %s: %s\n", argv[1], errbuf); 
    return(2); 
    } 

    while (packet = pcap_next(handle,&header)) { 

     packet_counter++; 

    } 
    pcap_close(handle); 


    printf("%d\n", packet_counter); 
    return 0; 
} 

Chú ý: bạn cần phải cài đặt các tiêu đề libpcap (trên tìm kiếm Linux cho libpcap dev/devel gói)

Sau đó biên dịch với gcc -o myprogram myprogram.c -lpcap

+1

Hoặc chỉ chạy capinfos, giống như tshark, là một phần của bản phân phối Wireshark và nó hoạt động ít hơn nhiều và sẽ tạo ra câu trả lời nhanh hơn. –

+0

Có nhiều cách khác nhau để thực hiện mọi thứ và tùy theo hoàn cảnh ... – UnX

+0

Nếu hoàn cảnh là "bạn đã cài đặt Wireshark, nó không phải là phiên bản quá cũ nên không có capinfos, và bạn muốn đếm nhanh các gói trong một tập tin ", cách tốt nhất để làm việc là sử dụng capinfos. –

Các vấn đề liên quan