2013-06-27 10 views
1

我有一個非常簡單的服務器,使用'net'模塊使用nodejs創建。 我也有一個使用luasockets連接到它的客戶端。 我現在正在測試連接2個月,使用不同的連接,如3G,GPRS,WIFI,一切都很好。客戶端運行在電話上。 今天,在測試期間,連接到WIFI,我只是從一個房間走到另一個房間,並且從服務器[nodejs,使用socket.write的網絡模塊]發送的一些消息沒有傳送到我的客戶端應用程序。 沒有錯誤,沒有部分信息,它只是在某處丟失。 在服務器上,socket.write()總是返回true。消息只是幾個字節。 就像我所說的 - 服務器和客戶端應用程序在2個月內多次測試,這是我第一次看到它。 我可以一直重現它:消息是從服務器發送的,但沒有到達客戶端。我能做些什麼來確保通過nodejs中的'net'通過TCP傳遞消息?

我的問題是......如何檢查信息丟失的地方?如何解決這個問題?

編輯: 我能在我的路由器運行tcpdump和發現送到確實通過路由器的消息,但他們有一個偉大的延遲做到這一點,他們都合併在一起,成爲一個單一的數據包。 我的tcpdump foo非常有限,我不確定是什麼原因導致延遲。我猜這是因爲客戶端無法收到消息,並且他們被緩衝在兩者之間的某處。 無論如何,這麼長時間的延遲和傳遞信息使得我無法接受,我不得不找出一些方法來處理它。

+0

TCP協議本身負責確保郵件已發送。它使用確認和重試系統。最終,你絕不能100%確定收到的消息正確。如果您要求某種特定類型的ack,那麼該怎麼辦......另一端如何知道您收到了答案?你的服務器必須確認客戶的確認? I/O,尤其是網絡,永遠不會是一個100%的命題,否則黑客就不存在,互聯網將變得更簡單,更安全。 TCP協議做得很好,你應該讓它爲你做好工作。 – ChrisCM

+0

感謝您的評論。好吧,我讓議定書來完成這項工作,只是在另一端我沒有收到任何東西。它必須在某處丟失。發送一個ACK是一個選項,我不需要確認ACK,我不關心它。我會改變這個問題,因爲看起來我需要知道信息丟失的地方,而不是怎麼做才能確保信息傳遞。 – Krystian

+0

代碼也會有幫助...最小的一組代碼可以產生你的行爲,這樣會很好。 – ChrisCM

回答

0

我們決定在客戶端和客戶端與服務器之間添加另一種類型的消息,以檢查連接狀態。 我們將使用1秒計時器將消息從一個客戶端發送到另一個客戶端,如果客戶端沒有收到超過3秒的消息,他們會認爲連接被中斷,並會向服務器發送消息,以檢查與服務器連接可以[只是爲了讓用戶知道問題存在的位置]。