правильный способ использовать pcap_next_ex или pcap_next (libpcap) - PullRequest
4 голосов
/ 15 октября 2010

Я видел такой код, используемый в проекте:

while (1)
{
  l_numPkts = pcap_next_ex( m_pcapHandle, &header, &pkt_data);
  //do something
  memcpy(dst,pkt_data,size);    
}

после возврата pcap_next_ex статус пакета будет установлен TP_STATUS_KERNEL, что означает, что buf был возвращен ядру код:

 /* next packet */
 switch (handle->md.tp_version) {
  case TPACKET_V1:
  h.h1->tp_status = TP_STATUS_KERNEL;
..

в некоторых высокоскоростных средах возникнет проблема с памятью?

и как правильно использовать pcap_next / pcap_next_ex?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Я завис на этой проблеме в python с winpcapy (1.9.2009) и WinPcap 4.1.0.2001.

Я решил это, просто создав копию массива пакетных данных (как предложено в memcpy, упомянутом в вопросе).

pkt_data = pkt_data[:header.contents.len]

Не уверен, что это правильно, но у меня сейчас работает.

И на основе ответа в winpcap papermail это то, на что ссылается pkt_data, должно сохраняться до следующего вызова pcap_next_ex (или другого метода отправки). Если я правильно понял, потому что он использует один буфер для большего количества / всех пакетов и поэтому его можно использовать повторно для других / последних пакетов?

Вопрос

0 голосов
/ 20 апреля 2015
char errbuff[10000];
pcap_t * handler = pcap_open_offline(argv[1], errbuff);
struct pcap_pkthdr *header;
u_char  *packet;
while (pcap_next_ex(handler, &header, &packet) >= 0)
{
    printf("len %d:\n",header->len);
     ... YOUR CODE


}
...