我的一个 .NET 应用程序在大约 1 分钟内触发约 300 个 HTTP 请求时出现以下异常:
System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted
对此我能找到的唯一建议是调整MaxUserPort
注册表中的设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
。
即使我已将此设置设为最大可能值,但仍然会发生异常。
答案1
事实证明,还有一种方法可以使用该netsh
服务设置最大开放端口的限制。
您可以使用以下方法检查当前值:
netsh int ipv4 show dynamicport tcp
在我的情况下,它被设置为 256。您可以使用以下命令轻松更改它:
netsh int ipv4 set dynamic tcp start=45000 num=10000
无需重新启动。
出现此问题的原因是,即使您HttpClient
在 .NET 中正确处理对象,套接字仍会TIME_WAIT
在一段时间内保持状态。因此,即使连接是连续的,限制仍然适用。
答案2
默认情况下,TCP 端口不会立即关闭,而是保持 TIME_WAIT 状态 120 秒。
将此设置减少TcpTimedWaitDelay
到 30 秒并将其设置StrictTimeWaitSeqCheck
为 1 可能会提高您的 TCP 性能。