2011-06-10 115 views
1

所以我一直有與PCap庫的接收功能的問題。PCap庫問題與接收

我建立了一個echo服務器(在我的PC之外),它只需要一個數據包並將其轉向。因此,在我的應用程序中,我發送了一個數據包(工作正常),並嘗試使用pcap_next()接收響應數據包(來自echo服務器)。出於某種原因,即使Wireshark顯示數據包在不到1ms的時間內轉向,它也會等待1秒鐘才能收到帶有pcap_next()的數據包。因此,當我發送1000個數據包時,需要1000秒才能收到所有響應。

我想不通爲什麼這樣做,所以我試着切換到pcap_loop()。顯然現在它正在做更奇怪的事情。我發送1000個數據包,並接收1000個數據包,但不按照我預期的順序。

我希望這(這是我看到的Wireshark):

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

你嘗試過'setsockopt' w /'TCP_NODELAY'嗎? (把它隨機扔出去......我只是最近纔讀到這個,想知道它是否相關:http://en.wikipedia.org/wiki/Nagle%27s_algorithm) – HostileFork 2011-06-10 22:03:30

+0

不適用。我正在發送原始的UDP數據包。 – theanine 2011-06-10 22:46:42

回答

0

找出解決方案。我需要在兩個獨立的線程上有TX和RX。

RX線程做這樣永遠:

pcap_loop(handle, -1, got_packet, NULL); 

然後我叫TX線程時,我想,這確實這(和循環然而很多時候我需要):

pcap_sendpacket(t, TxPacket, DataLen + 42); 

這解決了問題。

0

也許你想輪詢,而不是拉。只需撥打pcap_dispatchpcap_loop,它會盡快給您回電。 pcap_next效率不高,因爲它會在收到第一個數據包後啓動分發循環並停止它。閱讀更多在http://www.tcpdump.org/pcap.html

+0

是的,我嘗試過pcap_loop()。請完整閱讀我的文章。 – theanine 2011-06-10 20:46:32

+0

這是一個無賴。 – 2011-06-10 21:13:54