windows-动态端口问题

it2022-05-05  128

最近在对接rest时发现一个比较奇怪的问题,在Windows Web Server 2008上,用rest客户端发送数据时报错: bind: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. 经查,发现是因为频繁的打开关闭客户端的动态端口造成的。查找资料最后总结了一些解决方案,目前看是有效的。 1、修改动态端口的范围 首先看下服务器的动态端口设置情况: netsh int ipv4 show dynamicport tcp 一般如下: 表示动态端口是从49152开始,一共有16384个 我们修改一下动态端口的范围和个数: netsh int ipv4 set dynamicport tcp start=30000 num=20000 表示修改动态端口从30000起,一共有20000个。这时候需要注意的是,尽可能避开自己服务使用的端口,做一下简单的规划。

2、修改tcp的TimedWaitDelay时间 打开注册表:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters, 未手动修改时是默认的120s。在Parameters的右边空白处下右键新建一个项,如图: key值填写TcpTimedWaitDelay,value值选十进制,写10。表示最长wait时延为10s。 上面第一步我们已经修改了端口的动态范围,就没必要在注册表中设置,如果要是还想设置也可以。和修改TcpTimedWaitDelay一样,建一个key为MaxUserPort的项,value值填写50000,表示1024~50000之间的端口为动态端口。 操作第2步需要重启机器

3、连接池 确认自己的程序中对http客户端的使用,最好是有一个连接池,使用已经存在的链接,这种情况需要结合实际问题解决

参考: https://blog.csdn.net/zl325118/article/details/87073474 https://support.microsoft.com/en-us/help/929851/the-default-dynamic-port-range-for-tcp-ip-has-changed-in-windows-vista https://support.cerberusftp.com/hc/en-us/articles/202639489-Why-do-I-see-An-operation-on-a-socket-could-not-be-performed-because-the-system-lacked-sufficient-buffer-space-or-because-a-queue-was-full-error-mesasges-in-the-log-file-


最新回复(0)