2010-10-15 4 views
4

Я видел этот вид кода, используемый в проекте:правильный способ использовать pcap_next_ex или pcap_next (Libpcap)

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, что означает, что ЬиЙ было вернуться к ядру. код:

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

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

и каков правильный способ использования pcap_next/pcap_next_ex?

ответ

-3

Есть много примеров рабочих примеров pcap онлайн и полезных справочных страниц. Попробуйте здесь: TCPDUMP.org Нам нужно больше вашего кода, чтобы ответить на ваши вопросы.

+0

хорошо, я нашел, что это ошибка в 0.98 (но выглядит это не официальный релиз? Скачать форму http://public.lanl.gov/cpw/) в FUNC «pcap_next» или «pcap_next_ex» неверны, он не копировал пакет в безопасное место памяти перед возвратом в пользовательское приложение. – jon

+0

Интересно. В моем собственном тестировании с помощью pcap_next я заметил тот же результат, что и размер окна TCP уменьшился все меньше и меньше, пока он не достигнет нуля. Функция не освобождала буфер приема правильно, и мне пришлось переписать вместо recv() вместо полезных утилит pcap. Я не могу прокомментировать этот конкретный патч, но переключился на select()/recv(), который работал для моей проблемы. – Shawn

1

Я замораживал эту проблему в 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 (или другого метода отправки). Если я правильно понял, потому что он использует один буфер для большего количества/всех пакетов, и поэтому его можно повторно использовать для других/последних пакетов?

Q.

-1
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 


} 
Смежные вопросы