2013-01-24 208 views
1

我們有沒有本地端口(3050)給錯誤的結合WSAEADDRINUSE - Address already in use.無法綁定到本地端口 - WSAEADDRINUSE

但是在Windows服務器應用程序,我一直在使用的Sysinternals工具(的TCPView)檢查發現沒有進程正在偵聽該端口。

請提出什麼是背後的原因和解決這個問題的任何解決方法。

在此先感謝。

+0

歡迎來到Stack Overflow! –

+0

netstat爲該端口顯示什麼? – EJP

回答

5

即錯誤狀態將在兩個條件下發生:

1)的另一種插座已經綁定到該地址

2)綁定到該地址的插座最近關閉。

在第一種情況下,我認爲問題在於你在同一個程序中綁定了兩次端口號。

在第二種情況下,我想你的程序上一次運行在測試之前退出或墜毀的時間少於120秒。當你運行TCPView時,120秒已經過去了。

+0

感謝羅布。我會驗證上述條件。 – Gaurav

+0

我檢查了代碼,它似乎沒有綁定到端口兩次。此外,我嘗試綁定到3050-3054的其他端口,但是它在端口3055上正確綁定!但是,TCPView不顯示任何進程正在使用的這些端口。 請建議。 – Gaurav

1

如果您有權訪問底層C++代碼,則可以在調用bind()之前,在套接字上使用setsockopt()和參數SO_REUSEADDR。這將允許你的程序重新綁定到給定的端口,即使有一個來自之前程序運行的「套接字」套接字。

+0

我相信這隻有在使用SO_REUSEADDR選項配置較早的套接字時纔有可能? – Gaurav

+0

是的,你是對的。這個想法是在每次打開給定套接字時使用此選項,因此當發生崩潰時,在重新啓動時不會遇到ADDRINUSE錯誤。 – ryanbwork

+0

@Gaurav不,你不正確。這適用於UDP。當舊的連接端口處於TIME_WAIT狀態時,TCP出現問題。只有新的套接字需要SO_REUSEADDR。 – EJP