2012-06-12 51 views
2

我正在使用運行在Intranet中不同主機上的多個進程 的Windows(Microsoft Visual C++ 2005)應用程序。Windows應用程序中的套接字錯誤(10054)

進程使用TCP/IP相互通信。不同的進程可以在相同的主機上或在不同的主機上(即通信可以在相同的主機內或不同主機之間)。

我們目前有一個不規則地出現的錯誤。通信似乎工作 一段時間,然後停止工作。然後再運行一段時間。

當通信不起作用時,我們得到一個錯誤(顯然,當一個進程 試圖發送數據)。調用看起來是這樣的:

send(socket, (char *) data, (int) data_size, 0); 

通過檢查錯誤代碼,我們從

WSAGetLastError() 

讓我們看到,這是一個錯誤10054以下是我在微軟的文檔 中發現的(見here ):

WSAECONNRESET 
10054 

Connection reset by peer. 

An existing connection was forcibly closed by the remote host. This normally 
results if the peer application on the remote host is suddenly stopped, the 
host is rebooted, the host or remote network interface is disabled, or the 
remote host uses a hard close (see setsockopt for more information on the 
SO_LINGER option on the remote socket). This error may also result if a 
connection was broken due to keep-alive activity detecting a failure while 
one or more operations are in progress. Operations that were in progress 
fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET. 

所以,據我所知,連接被接收過程中斷。 在某些情況下,此錯誤爲(AFAIK)正確:一個進程已終止,因此無法訪問 。在其他情況下,發件人和收件人都在運行 和記錄活動,但由於上述錯誤而無法通信(在日誌中報告了錯誤 )。

我的問題。

  • SO_LINGER選項是什麼意思?
  • 什麼是保持活動狀態?它如何中斷連接?
  • 怎麼可能避免這個問題或從中恢復?

關於最後一個問題。我們嘗試的第一個解決方案(實際上,它是一個 解決方法)是在發生錯誤時重新發送消息。不幸的是, 同樣的錯誤一遍又一遍地發生了一段時間(幾分鐘)。所以這不是 的一個解決方案。

目前我們不明白,如果我們有軟件問題或配置 問題:也許我們應該檢查在Windows註冊表中的東西?

一個假設是,OS用完臨時端口(如果連接 關閉,但因爲TcpTimedWaitDelay的港口都沒有公佈),但通過分析 這個問題,我們認爲應該有很多他們:問題如果在進程之間消息發送不太頻繁,則甚至會發生 。但是,我們仍然不是 100%確定我們可以排除這種情況:短暫端口會以某種方式丟失(???)

,這可能有助於另一個細節是發送和接收發生在每一個過程同時 在單獨的線程:是否有在 TCP/IP庫中的任何共享的數據結構,可能會損壞?

什麼也很奇怪的是,問題不規律地發生:溝通工程 好幾分鐘,然後它不工作幾分鐘,然後再次工作。

謝謝你的任何想法和建議。

編輯

謝謝你的提示確認唯一可能的解釋是連接關閉錯誤。通過對問題的進一步分析,我們發現連接的服務器端進程崩潰/已被終止並且已被重新啓動。因此,有一個新的服務器進程正在運行並在正確的端口上偵聽,但客戶端未檢測到此消息,並且仍在嘗試使用舊連接。我們現在有一種機制來檢測這種情況並重置客戶端的連接。

+0

HI Giargio,我面臨着同樣的問題在C#中的RDP連接(3389)。但連接中斷是50秒。 –

回答

4

該錯誤表示連接被遠程站點的 關閉。所以你不能在你的程序中做任何事情,除非接受連接中斷。

+0

是的,但遠程站點是我們應用程序中的另一個進程。遠程站點在關閉連接時正在運行。我們正在試圖理解爲什麼這些關係沒有明顯的原因關閉。 – Giorgio

+0

您是否設置了連接超時? – rekire

+0

我們有SO_SNDTIMEO,SO_RCVTIMEO == 3秒。 – Giorgio

1

我最近幾天面臨這個問題,發現Adobe Acrobat Reader更新是罪魁禍首。只要您從系統中完全卸載Adobe,所有內容都將恢復正常。

相關問題