最近在工作中遇到这样一个场景:使用一个Java编写的模拟硬件设备的工具,这个工具会模拟很多设备(每个设备需要占用一个端口)去连接服务器。一般情况下,一台Windows虚拟机上会模拟5000至10000个设备,这样一般不会有问题。后来改成模拟40000个设备的时候,出现了“No buffer space available”的异常,具体如下:

1. 问题原因

乍一看以为是虚拟机内存不够或者是模拟工具分配的内存不够,后来检查发现,并不是这个原因。经过查找资料发现,这是端口不够所导致的。Windows默认情况下的端口启用情况可以用命令: netsh int ipv4 show dynamicportrange tcp来查看,具体如下:

可以看到,默认情况下启用端口数只有16384个,所以出现了上述错误。

2. 解决方法

管理身份运行命令窗口,然后通过命令netsh int ipv4 set dynamicport tcp start=2000 num=63000修改端口数。

其中:
start为起始端口号
num为端口数量

执行上述命令后再次查看端口启用情况:

可以看到,现在启用的端口总数是63000。这样上述问题就解决了!

3. 结语

因为在协议里端口使用两个字节存储的,所以端口的最大数量为65536。所以,单台机器上运行的程序占用的端口数不能超过这个数量。目前我还不知道是否有其他方法可以突破这个限制,如果有,还请大神赐教。

更多推荐

【No buffer space available】异常解决