我希望我的程序绑定到一个自由端口。
谷歌告诉我,使用port = 0的绑定会这样做,但是我没有发现这是否可以保证在任何系统上运行(特别是Windows / Linux)。有人可以链接说出来的文档吗?
答案 0 :(得分:5)
它在4.2BSD套接字API中肯定是“标准”,大多数其他所有实现都是从这个API中派生出来的,但我并不知道任何实际上这样说的正式规范。
答案 1 :(得分:4)
据我所知,这是普遍的,但我在标准中找不到任何文字。可能更具可移植性的替代方法是使用带有空服务名称指针的getaddrinfo
和AI_PASSIVE
标志。这可以保证为您sockaddr
提供bind
。这也是让管理员选择哪个本地ip(v4或v6)的正确方法
要绑定的地址。
答案 2 :(得分:2)
这是AF_INET地址系列的标准记录行为:
http://man7.org/linux/man-pages/man7/ip.7.html
请参阅ip_local_port_range,其中包含以下内容:
An ephemeral port is allocated to a socket in the following circumstances:
* the port number in a socket address is specified as 0 when
calling bind(2);
答案 3 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
int main()
{
struct sockaddr_in addr;
socklen_t addrLen;
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
printf("Failed to create socket");
}
addr.sin_family = AF_INET;
addr.sin_port = 0;
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
printf("Failed to bind");
}
addrLen = sizeof(addr);
if (getsockname(fd, (struct sockaddr *)&addr, &addrLen) == -1) {
printf("getsockname() failed");
}
printf("port=%d \n", addr.sin_port);
return 0;
}