【发布时间】:2013-05-26 10:05:45
【问题描述】:
我正在尝试编写一些套接字应用程序并遇到问题。我希望操作系统为我的地址选择随机的可用端口号。 但我收到端口号 = 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
【问题讨论】:
-
@AhmedMasud 您提供的报价明确是关于一个根本没有绑定的套接字。与您所声称的相反,那里没有任何内容说您必须这样做,并且那里也没有任何内容说您不能 bind() 到零端口,这也是您所声称的。您还可以将 () 绑定到零 地址, 即 INADDR_ANY。