2012-09-08 58 views
1

我有一個TCP服務器使用select通過TCP套接字從客戶端獲取數據。 服務器消耗數據的速度很慢,而客戶端速度更快。我的客戶端發送每次它 -open一個新的連接 -write數據 -disconnect 正因爲如此(服務器套接字必須接受許多連接)我的listen的backlock值提高到500__connect_no_cancel塊和服務器獲取數據不按順序

8個字節的數據和

儘管有此設置,但在某些時候,我可以看到 - 我的客戶端塊在pthread函數__connect_nocancel中,這種情況經常發生。 - 一段時間後,我的服務器開始接收訂單中的數據。第一個數據混淆了客戶端阻塞的地方(其他地方)。

我認爲增加積壓可能會解決這個問題,但這個問題,但事實並非如此。

你能幫我嗎?我在Linux的2.6.32

乾杯

AFG

回答

1

listen(2)的積壓參數通常限制在OS網絡堆棧內的某個值。在Linux上,默認值是128.

真正的問題是,正如@EJP所說的,你完全錯誤地使用TCP。

+0

最後,我發現如果你的積壓值較大,你需要在/ proc/sys/net/core/somaxconn中寫入你想要的值 –

0

如果排序是非常重要的,你的客戶端必須只保留一個連接打開和寫入經由單個連接一切。對此沒有兩種方法。 TCP保證字節順序與流。 Nothing保證不同連接的服務器端處理的順序。

它也更有效率。目前您每八個字節交換八個數據包,這意味着高達160字節的開銷。

+0

我知道,我知道這一點;不幸的是,由於情況(即實施它的時間很緊),我無法改變我正在進行的項目,我必須解決我現在擁有的項目。 –