2010-06-23 72 views
4

我使用套接字在C#.NET中有一個客戶端服務器應用程序寫入器。爲什麼我的客戶端服務器套接字連接保持斷開連接

我經常收到日誌信息(比如約4每小時)說這句話的消息,

An existing connection was forcibly closed by the remote host 

在這種情況下,這裏的錯誤是在「服務器」端存在的。

我決定使用wireshark來分析發生什麼,我得到了這個。沒有延遲,這一切都在幾秒鐘內發生。

Server > Client [PSH, ACK] Seq=55653 Ack=4472 Win=63940 Len=148 
Client > Server [ACK]  Seq=4472 Ack=55801 Win=4038 Len=0 
Server > Client [PSH, ACK] Seq=55801 Ack=4472 Win=63940 Len=148 
Client > Server [ACK]  Seq=4472 Ack=55949 Win=4001 Len=0 
Server > Client [PSH, ACK] Seq=55949 Ack=4472 Win=63940 Len=142 
Client > Server [PSH, ACK] Seq=4472 Ack=55949 Win=4001 Len=31 
Client > Server [RST, ACK] Seq=4503 Ack=55949 Win=0  Len=0 

所以客戶端和服務器正在發送東西(PSH)和確認東西(ACK)之間的東西。突然之間RST正在發生。這根據維基百科是一個重置,並且這個重置對應於'我現在獲得的'現有連接是強行...'的消息。

雖然這是什麼意思?這是否意味着重置導致問題?我認爲答案是否定的,更有意義的是重置是問題的結果?即服務器端的套接字由於某種原因而死掉,客戶端會將復位發送給服務器以嘗試喚醒它。

想法?

回答

1

有時候,行爲不當的客戶端會得到或發送它想要的,然後立即退出(關閉套接字並突然斷開連接)。偶爾在任何暴露於互聯網的服務上看到這種情況是很正常的。

如果它是您自己的代碼導致此,請確保您發送任何「我現在完成」命令(常見的是「QUIT」),並在關閉它之前正確「關閉」連接。除此之外,關於您應該造成的唯一重置將涉及您的互聯網訪問剝落。

+0

那麼你說的第一段黑客對不對?不是那樣,但是一個好點。你提到發送'我現在完成'的命令。我會研究這一點,因爲我認爲這可能有幫助。但問題是我懷疑它沒有完成。它不應該關閉它的連接,如果是這樣,我希望看到其他類型的錯誤。 – peter 2010-06-23 03:27:31

+0

我指的是黑客以及寫得不好(但合法)的客戶。只要你的服務器代碼能夠說明人們做錯了什麼(合法與否),除了知道你在給定端口上運行的東西的人之外,你沒有什麼可擔心的。至於你的客戶爲什麼重置連接(聽起來可能是這種情況,如果你的互聯網連接穩定),是否有可能觸發異常,使代碼離開你的使用區塊(你*正在使用塊,對吧?)和處理插座? – cHao 2010-06-23 04:57:09

0

服務器和客戶端都是你自己的代碼。即使我面臨類似的問題,但在我的情況下,服務器不是我的代碼,所以我無法真正瞭解客戶端爲什麼關閉連接併發送PSH和RST消息。

在任何一種情況下,如果您得到的錯誤類似於您已獲得的錯誤,則可以創建新套接字並建立通信。

相關問題