2014-03-04 360 views
0

我在lwip上做了一個應用基礎,applcation只是發送數據給服務器; 當我的應用程序工作了一段時間(大約5小時)後,我發現發送線程掛在send()函數中,大約30分鐘後send()返回0,我的線程運行agin; 在服務器端,有一個keepalive,它的時間是5分鐘,當我的應用程序hungs,5分鐘後服務器關閉sockect,但我的應用程序沒有得到這個,仍然在send()直到30min得到0 return;爲什麼會發生? 1:上傳速度不夠發送數據,會不會發送? 2:也許服務器沒有及時讀取數據,並且它使發送緩衝區滿和hungs?lwip - tcp socket在send()中被阻塞的原因是什麼?

我該如何避免這些peoblems在我的代碼?我嘗試設置TCP_NODELAY,SO_SNDTIMEO並選擇發送之前,但也有這個問題。

回答

0

send()當接收者距離發件人太遠時會阻止。 recv()在對等關閉連接時返回零,這意味着您必須關閉套接字並停止讀取。

+0

對於我的應用程序,只需發送數據,並選擇很短的時間(10毫秒)來讀取。實際上,服務器不會發回數據,只是讀取。首先,我猜可能服務器發送數據,我有首先不要讀取和阻止服務器,所以我試着去讀取我的線程空閒時間,但沒有數據。 – Bambooeric

+0

定義'沒有數據讀取'。反而發生了什麼?阻止? 'EAGAIN/EWOULDBLOCK'? 'recv()'返回零? – EJP

+0

我在select之前做了select,沒有選擇數據,所以沒有運行recv();而且我檢查服務器agin,發現我的應用程序在發送時,服務器試圖關閉套接字,但無法關閉似乎FIN數據不能發送或reiceve ....所以這是我的應用長時間阻塞的原因。它是怎麼發生的? – Bambooeric

相關問題