监听随机端口

业务上存在需求,一类服务监听随机端口,并由服务发现业务管理内部分配,那么我们如何实现监听随机端口呢?

实际上将端口设置为0即可在规定范围内,分配一个可bind的端口

不论windows还是linux中bind函数传入port为0时,都将随机分配一个端口,相关文档可以查看下面的参考资料

随机端口的规定范围

linux和windows的规定不一致,但是可以由proc配置/注册表等手段修改

Linux
默认为32768 - 60999 之间
在文件cat /proc/sys/net/ipv4/ip_local_port_range设定的范围内获取一个随机端口

Windows
默认为 49152 - 65535 之间
可以修改注册表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 修改值

如何获取bind成功的具体端口

本身业务上随机bind成功之后,需要获取最后成功的bindPort上报给服务发现业务,因此我们在设定端口为0之后,我们可以通过getsockname函数获取当前的句柄bind的端口,
下面给定一个简单的linux例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct sockaddr_in serveraddr;
socklen_t len = sizeof(serveraddr);
int bindPort;

if (bind(sockfd, (sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
{
// Warning("%s, Failed to bind server socket at address[%s:%s]\n", __PRETTY_FUNCTION__, ip.data(), port.data());
close(sockfd);
return false;
}

getsockname(sockfd, (struct sockaddr *) &serveraddr, &len);
bindPort = ntohs(serveraddr.sin_port); // get the real port


参考资料

Author

Nevermore

Posted on

2022-01-12

Updated on

2024-02-21

Licensed under