2015-04-07 187 views
0

我在我的服務器和客戶端之間建立了一個TCP連接,它運行在同一臺主機上。我們從服務器上收集和讀取數據,或者不斷在我們的案例中說出來源 我們讀取3個不同端口的數據。客戶端和服務器之間的TCP連接出錯了

一旦源停止發佈數據或重新啓動,服務器/源將無法再在同一端口上發佈數據,說明端口已經綁定。給出的原因是客戶端仍然在這些端口上建立連接。

我想知道這可能是什麼原因?會不會有問題,因爲客戶端已經在監聽這些端口並試圖重新連接,因爲我們嘗試重新連接機制。當源和客戶端位於不同的主機上時,我更願意在源端找到相同的代碼,而不是相同的主機對我們來說工作得很好。

編輯: - 我在閱讀各種文章時發現了這個。

使用SO_LINGER上發送接近一個RST,以避免TIME_WAIT狀態的問題:我一直有一些問題,路由器接入服務器(未公佈姓名,以保護有罪)有處理後臺問題專用於特定通道的調制解調器上的背對背連接。他們所做的是釋放連接,接受另一個調用,嘗試連接到主機上的衆所周知的套接字,並且主機拒絕連接,因爲在TIME_WAIT狀態下存在一個涉及衆所周知的套接字的連接。 (Stevens的書TCP Illustrated,第1卷更詳細地討論了這個問題。)爲了避免連接被拒絕的問題,我必須安裝一個選項來在服務器上執行close-reset-啓動斷開。

鏈接來源: - http://developerweb.net/viewtopic.php?id=2941

我想我面臨同樣的問題:「嘗試連接到一個衆所周知的插座的主機上,並且主機拒絕連接」。可能的修復方法是'在服務器啓動斷開連接時在服務器上進行重置關閉的選項'。現在我該怎麼做?

+0

不要對不是代碼的文本使用代碼格式。 – EJP

+0

請不要將代碼格式設置爲不是代碼的文本。 – EJP

回答

0

在重新啓動/關閉服務器之前,您需要關閉綁定到該端口的套接字!

http://www.gnu.org/software/libc/manual/html_node/Closing-a-Socket.html

此外,還有一個超時時間,我認爲這是4分鐘,所以如果你創建了一個TCP套接字,並關閉它,你可能還是要等待4分鐘,直到它關閉。

您可以使用netstat查看系統上的所有綁定端口。如果關閉服務器或在連接分叉後關閉服務器,則可能會有殭屍進程綁​​定到某些不關閉並保持活動狀態的端口,因此無法重新綁定到同一端口。顯示一些代碼。

+0

netstat顯示客戶端連接仍然存在,但我不確定它是否從客戶端連接或由於不正確的方式導致服務器關閉而沒有關閉套接字。問題是當客戶端進程關閉時,服務器能夠再次在這些端口上發佈。 – Invictus

+0

你如何關閉服務器上的套接字?發生了什麼,我相信服務器套接字沒有發送TCP連接的緊密握手,並且您的客戶端仍在使用該套接字或者,因爲您沒有在服務器上關閉套接字,所以套接字保持打開狀態(及其陷入殭屍進程)。確保在關閉時調用shutdown值,而不是關閉,以確保套接字完全關閉(無需等待傳輸)。 http://www.gnu.org/software/libc/manual/html_node/Closing-a-Socket.html – Magn3s1um

+0

在退出擁有它的進程之前,不需要關閉套接字。 Linux會爲你做到這一點,包括握手。添加關機不會改變行爲。否則您的鏈接不會說。 – EJP

1

綁定,然後致電listen().

編輯反覆折騰SO_LINGER選項是毫無價值的和危險的飛行數據的建議之前,設置服務器插槽上的SO_REUSEADDR選項。只需使用SO_RESUSEADDR.

+0

編輯我的問題,給出我正面臨的確切場景。你的答案仍然適用於此? – Invictus

相關問題