2011-06-10 3 views
1

그래서 PCap 라이브러리의 수신 기능에 문제가 있습니다.PCap 라이브러리 문제 수신

패킷을 가져 와서 주위를 돌리는 에코 서버 (내 PC 외부)를 설치했습니다. 그래서, 내 응용 프로그램에서 패킷을 보내 (잘 작동합니다) 및 응답 패킷 (에코 서버에서) pcap_next() 받았습니다. Wireshark가 패킷이 1ms 미만으로 돌아 다니는 것을 보여 주더라도 pcap_next()로 패킷을 받기 위해 어떤 이유로 1 초를 기다릴 것입니다. 따라서 1000 개의 패킷을 보낼 때 모든 응답을 수신하는 데 1000 초가 소요됩니다.

왜 그렇게했는지 알 수 없으므로 pcap_loop()으로 전환 해 보았습니다. 이제는 더 이상한 일을하고있는 것 같습니다. 내가 1000 패킷을 보내 1000 패킷을받을 수 있지만 내가 기대하는 순서로.

Send packet #1 
Receive packet #1 
Send packet #2 
Receive packet #2 
etc. 

을하지만이 정말 무엇을 얻을 :

나는이 (이것은 내가 와이어 샤크에 표시되는 내용입니다) 기대

Send packet #1 
Send packet #2 
etc. 
Wait 1 second 
Receive packet #1 
Receive packet #2 
etc. 

여기 무슨 일이야?

+0

'TCP_NODELAY'가있는'setsockopt'를 사용해 보셨습니까? (저기서 무작위로 던지면 ... 관련성이 있는지 궁금하다. http://en.wikipedia.org/wiki/Nagle%27s_algorithm) – HostileFork

+0

해당 사항 없음. 원시 UDP 패킷을 보냈습니다. – theanine

답변

0

해결책을 찾아 냈습니다. 나는 두 개의 분리 된 쓰레드에 TX와 RX를 가질 필요가 있었다.

RX 스레드이 영원히 수행합니다

pcap_sendpacket(t, TxPacket, DataLen + 42); 

이것은 해결 : 내가 원하는 때마다

그런 다음
pcap_loop(handle, -1, got_packet, NULL); 

나는 (내가 필요하지만 여러 번 및 루프)이 작업을 수행하는, 텍사스 스레드를 호출 문제.

0

아마도 투표를하고 싶지는 않을 것입니다. pcap_dispatch 또는 pcap_loop으로 전화하면 가능한 한 빨리 패킷으로 다시 전화를 겁니다. pcap_next은 디스패치 루프를 시작하고 주 패킷이 수신 된 후 중지됩니다. http://www.tcpdump.org/pcap.html

+0

예, pcap_loop()을 시도했습니다. 내 게시물을 완전히 읽으십시오. – theanine

+0

그건 좀 어색해. –