bind()选择零端口

时间:2013-05-26 10:05:46

标签: linux sockets unix posix

我正在尝试编写一些套接字应用程序并遇到问题。我希望操作系统为我的地址选择随机免费端口号。 但我收到端口号= 0.我做错了什么?

struct sockaddr_in addr;
socklen_t addrLen;
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
    ThreadError("Failed to create data channel socket");
}
addr.sin_family = AF_INET;
addr.sin_port = 0; // pick random free port
addr.sin_addr.s_addr = srvAddr; // = inet_addr(127.0.0.1)
if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
    ThreadError("Failed to bind data channel");
}
if (getsockname(fd, (struct sockaddr *)&addr, &addrLen) == -1) {
    ThreadError("getsockname() failed");
}
if (listen(fd, 1) == -1) {
    ThreadError("Failed to set socket to listen mode");
}
// addr.sin_port == 0

1 个答案:

答案 0 :(得分:5)

在致电addrlen = sizeof addr之前,您需要设置getsockname

尺寸是进出参数。您可以指定要提供的缓冲区的大小,该函数通过修改大小来告诉您它使用了多少缓冲区。