Я видел этот вид кода, используемый в проекте:правильный способ использовать 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?
хорошо, я нашел, что это ошибка в 0.98 (но выглядит это не официальный релиз? Скачать форму http://public.lanl.gov/cpw/) в FUNC «pcap_next» или «pcap_next_ex» неверны, он не копировал пакет в безопасное место памяти перед возвратом в пользовательское приложение. – jon
Интересно. В моем собственном тестировании с помощью pcap_next я заметил тот же результат, что и размер окна TCP уменьшился все меньше и меньше, пока он не достигнет нуля. Функция не освобождала буфер приема правильно, и мне пришлось переписать вместо recv() вместо полезных утилит pcap. Я не могу прокомментировать этот конкретный патч, но переключился на select()/recv(), который работал для моей проблемы. – Shawn