2012-06-04 45 views
3

我有一個服務,當它開始調用TcpListener實例的Start()方法時。此偵聽器正在使用一個不常見且不被任何其他服務使用的端口。很少有一分鐘左右,它會遇到一個奇怪的錯誤。一分鐘的服務(其上立即重新啓動失敗)背靠背崩潰以下異常:C# - TcpListener.Start()導致SocketException的消息「每個套接字地址只有一個用法」

SocketException 
    at System.Net.Sockets.Socket.DoBind(System.Net.EndPoint, System.Net.SocketAddress) 
    at System.Net.Sockets.Socket.Bind(System.Net.EndPoint) 
    at System.Net.Sockets.TcpListener.Start(Int32) 
    at MyTestServer.Server.StartListening() 

隨着異常消息如下:

Only one usage of each socket address (protocol/network address/port) is normally permitted 

This文章認爲,我的經驗端口用盡,我應該調整註冊表來修改WinSock的超時和端口範圍值。這一切都很好,但我只有(或期望有)50-100個客戶端連接。我怎麼可能用完端口?機器人和端口掃描儀?

+0

您是否綁定到特定的IP地址以及端口號? – EJP

回答

4

它可能不是港口枯竭,因爲它在那個職位。他們連接出WCF(這將像TCPClient)。您綁定到TCP端口並等待連接。這不完全是一回事。您綁定到特定的TCP端口號。當您收到此消息時,Windows(正確與否)認爲它正在使用中。 Windows正在報告另一個進程已經綁定到該端口,所以你不能。你可以有2個進程試圖使用該端口並得到這個問題,所以50-100的數字不是問題。

要麼您在其他地方導致此問題,要麼導致此問題存在其他某個應用程序。

如果服務遇到問題並且在沒有調用TCPListener.Stop()的情況下死亡,則服務將自行重新啓動,它將無法綁定到端口,因爲Windows可能不知道該過程已完成。

您必須發佈更多詳細信息以進一步瞭解它。

+0

是的,當我發佈後,我意識到我沒有指定我是否使用普通端口。總之,我不是。此端口僅用於我的服務,也是該端口的唯一偵聽器,並且在服務啓動時僅調用一次Start()。也不,我沒有在終於叫Stop()。將添加在。 – kmarks2

+1

然後,我會說問題是在開始體驗這個之前,套接字沒有正常關閉。最終,Windows意識到這個過程已經結束並釋放資源,但在這之前不會造成這個問題。拋出一個異常和死亡(或其他可能阻止.Stop()被調用的東西)? – Tremmors

相關問題