[解決]通常每個套接字地址只允許使用一次

NO IMAGE

我們在做socket的開發的時候,經常會遇到這個錯誤:通常每個套接字地址 (協議/網路地址/埠)只允許使用一次

錯誤指示很明確:通訊埠被佔用了,導致通訊無法進行。

但為什麼埠被佔用了呢?什麼埠被佔用了?

這裡其實有一個大前提:你的程式中有沒有指定socket通訊埠?

如果指定了,解決辦法很簡單,每次通訊完成手動釋放就行了。下次通訊重新建立連線。

如果沒有指定,說明以下幾點(可能你命中的是其中一點):

1、你的伺服器開啟的埠數太少;

2、連線釋放等待時間太長;

3、你的socket通訊併發量太大。

以上幾點導致你伺服器埠被佔滿,下次通訊無空閒埠可用,程式就丟擲了“通常每個套接字地址 (協議/網路地址/埠)只允許使用一次”的異常。

原因找到了,解決起來也就簡單了,針對1、2兩點,我們修改伺服器配置就行了。

如果你的伺服器是windows2003或xp,預設埠只開到5000,而且超時等待預設是240秒(這裡有官方說明:http://msdn.microsoft.com/zh-cn/library/aa560610(v=bts.10).aspx),我們只需把伺服器埠全開啟,並且根據自己的情況調整超時時間。

具體操作:

1、開啟登錄檔(執行命令:regedit)

2、找到登錄檔節點:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

3、新增2項(如果已存在就修改項值),值對應的都是10進位制數字

MaxUserPort=65534 (埠數設到最大)

TcpTimedWaitDelay=5 (超時等待是5秒,根據個人需要)

4、重啟伺服器

搞定!

作者:朱會震