الحصول على عدد الحزم في ملف التقاط pcap؟

StackOverflow https://stackoverflow.com/questions/681011

  •  22-08-2019
  •  | 
  •  

سؤال

أحتاج إلى برنامج يطبع عدد الحزم في ملف الالتقاط الذي يستخدم ملف تنسيق بي كاب.لا يبدو أن هذا الرقم متوفر في رأس pcap (ربما لأنه مكتوب قبل بدء الالتقاط) ولا يبدو أن هناك "تذييلًا" في الملف يحتوي على هذه المعلومات.

لذا، أعتقد أن الخوارزمية الوحيدة هي تكرار جميع الحزم وجمعها.إنه في O(N)، وبالنسبة للآثار الكبيرة، فهو طويل جدًا.

أقوم بالنشر هنا لمعرفة ما إذا كان لدى شخص ما فكرة أكثر ذكاءً؟

لقد قمت بوضع علامة "C" لأنها اللغة التي أستخدمها حاليًا ولكن أعتقد أنها مشكلة مستقلة عن اللغة.

هل كانت مفيدة؟

المحلول

ذكر

وروبرت ادموندز، مؤلف كتاب pcaputils، بالنسبة لي أن هناك بالفعل برنامج فعل ما أريد، capinfos، في حزمة إيثار ريال. فإنه يعرض مؤشرات مختلفة حول ملف تمويله، بما في ذلك عدد من الحزم انها تحتوي على.

وقراءة شفرة المصدر، يبدو للعمل عن طريق المشي الملف بأكمله، على التوالي.

نصائح أخرى

و <م> فقط طريقة لتحديد عدد الحزم الموجودة في الملف هي قراءة الملف بأكمله. هناك، في الواقع، لا حزمة عد في رأس الملف (لأن شكل صمم ليكون قابل للكتابة في مرور واحد)، وهناك، في الواقع، لا تذييل الصفحة.

إذا كنت تريد رقم عدد الإطارات في pcap :

tshark -r test.cap | wc -l

باستخدام كابينفوس:

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

باستخدام تكبدمب:

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

لذا، استخدم libpcap بشكل أساسي، إليك مثال:

#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;
}

ملحوظة:تحتاج إلى تثبيت رؤوس libpcap (في بحث Linux عن حزمة libpcap dev/devel)

ثم قم بالتجميع باستخدام gcc -o myprogram myprogram.c -lpcap

والأسلوب الوحيد الذي أعرفه من هو قراءة الملف، والإطار القبض على جانب الإطار القبض وزيادة على "مكافحة الحزمة. وهناك، ومع ذلك، رأس إطار صغير الذي يحتوي على طول الإطار المخزنة، لذلك يمكن أن تسعى إلى الأمام في ملف بهذا الطول. قد لا يكون أي أسرع، فتذكروا.

ولكن، إذا كنت ترغب في القيام بأكثر من مجرد حساب عدد الإطارات الملتقطة، قد يكون من المنطقي أن يقرأ من خلال البيانات وبناء سلسلة من الإطارات الملتقطة في حين عد لهم، لاستخدامها في المستقبل. مكتبة PCAP بلدي لاللثغة المشتركة يفعل هذا. يقرأ "الإطار التالي" على أساس ما هو مطلوب، وتخزين إطارات الخام في قائمة مرتبطة مزدوجة لتسهيل المستقبل "السابق التالي /" الملاحة الإطار، قراءة المزيد من الإطارات من القرص حسب الحاجة. ومع ذلك، يتم ترك إعراب محتويات الإطار إلى السلطة التقديرية للمستخدم مكتبة ولا ينفذ ببساطة عن طريق قراءة الثمانية إطار في بنية البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top