2009-06-18 64 views
4

我一直在做套接字編程多年,但我從來沒有錯過使用TCP的消息 - 直到現在。我有一個java服務器和C客戶端 - 都在本地主機上。他們會以字符串的形式來回傳遞短信息,而且兩者之間有一些延遲。我有一個特殊情況,消息永遠不會到達客戶端。它是可重現的,但奇怪的是與機器有關。未接的套接字消息

爲了給出更多的細節,我可以調試服務器端,並看到發送,然後刷新。我可以附加到客戶端,並通過選擇的呼叫(循環),但它從來沒有出現。有沒有人遇到過這個問題,並且除編碼錯誤之外還有其他解釋嗎?

換句話說,如果你有一個連接的套接字,並在一邊進行寫操作,而在另一邊進行讀操作,那麼在中間會發生什麼類似的事情?

另一個細節 - 我已經在回送接口上使用tcpdump,並可以看到錯過的消息。

+0

您的客戶端是多線程的嗎?是否有可能單獨的線程也選擇()該消息?另外,你在使用什麼操作系統? – 2009-06-18 04:26:10

+0

我不認爲它有可能讓另一個線程選擇它。這是在Linux上。好主意 - 我用櫃檯覈實。 – AdamC 2009-06-18 04:59:11

回答

1

最後 - 在嗅探一些之後,我發現了這個問題。兩條消息在閱讀之前發送(有時,但很少......),所以它們都被讀取,但只有第一條被處理。這就是爲什麼它看起來好像第二條消息沒有到達。它被埋在接收緩衝區中。

4

我以前見過這種情況發生在SMTP交易中。你有在該機器上運行的病毒掃描程序?如果是這樣,請嘗試關閉它,看看是否有所作爲。

否則,我會建議安裝Wireshark,這樣你就可以看看實際發生了什麼。

+0

他使用tcpdump並看到丟失的消息。 Wireshark提供了更多細節,但不會有很大的變化。 – bortzmeyer 2009-06-18 08:50:21