2016-12-16 1 views
0

나는 pcap_next_ex로 패킷을 캡쳐하는 루프를 가지고 있으며, 각 iteraction에서 패킷 처리에 따라 많은 함수 호출을한다. 이 물건은 루프에서 Sleep() 호출로 시뮬레이션 할 수 있습니다. 그러면 pcap_next_ex() 루프에서 Sleep을 호출하면 어떻게됩니까? 내가 pcap_next_ex를 사용하고 나중에 다른 스레드를 처리하는 벡터에서 패킷을 저장 코드를 보았다Winpcap 코드 - 캡쳐가 루프에서 패킷을 잃는다.

pcap_pkthdr* header = NULL; 

UCHAR* content = NULL; 

pcap = pcap_open(adapterName.c_str(), 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, NULL); 

//Set to nonblock mode? 

while (INT res = pcap_next_ex(pcap, &header, const_cast<const UCHAR**>(&content)) >= 0) 
{ 
    if (res != FALSE) 
    { 
     if (content) 
     { 
      //Here i do the stuff which I will simulate with a Sleep() call 

      Sleep(200); 
     } 
    } 
} 

,이 방법은 특히 물건의 시간을 줄일 수 있지만, 나에게 많은 설득하지 않습니다. 이 방법을 사용해야합니까?

"비 차단"모드에서 패킷을 캡처하고 오는 각 패킷에 대해 이벤트를 호출하는 다른 winpcap 기능을 사용하고 싶습니다 ... winpcap을 사용하여 패킷을 손실하지 않는 가장 좋은 방법은 무엇입니까?

도움이 될 것입니다. 문안 인사.

답변

1

WinPcap은 캡처 한 패킷을 크기가 제한된 링 버퍼에 저장합니다. 패킷의 바이트 수가 링 버퍼 크기에 도달하면 WinPcap이 새 패킷을 저장할 수 있도록 이전 패킷이 삭제됩니다.

따라서 가능한 한 많은 패킷을 가져 와서 버려지기 전에 가능한 한 자주 pcap_next_ex을 호출해야합니다.

전용 스레드에서 pcap_next_ex을 호출하고 다른 스레드에서 패킷을 처리하는 것이 좋습니다.이 방법은 pcap_next_ex을 가장 자주 호출 할 수 있기 때문에 좋은 방법입니다.

+0

답장을 보내 주셔서 감사합니다. "pcap_loop"또는 "pcap_dispatch"에 대해 어떻게 생각하십니까? 문제를 해결할 수 있습니까? 그렇지 않으면 "pcap_next_ex"를 더 자주 호출해야하거나 다른 스레드를 만들어 패킷을 처리해야한다고 말합니다. – KaxperdayTrolling

+0

WinPcap의 소스에 관해서는'pcap_loop' (또는'pcap_dispatch')에 전달 된 콜백이'pcap_loop'을 호출 한 동일한 스레드에서 호출됩니다. 즉'pcap_loop'에 대한 전용 스레드가 여전히 필요합니다. 가능한 한 빨리 링 버퍼를 읽는 작업으로 돌아갈 수 있습니다. – kaitoy

관련 문제