我們在做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、重啟服務器
搞定!