【问题标题】:bind() server socket to any port always gives port no. 0 [duplicate]bind() 服务器套接字到任何端口总是给出端口号。 0 [重复]
【发布时间】:2013-12-19 09:55:19
【问题描述】:

我需要将我的服务器绑定到一个动态端口(使用一个临时端口),但是当端口被指定为 0(这意味着任何随机端口)时调用 bind() 总是将服务器绑定到端口 0。

//示例代码sn-p

int sockfd;
struct sockaddr_in serv_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
   error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(INADDR_ANY);  //randomly selected port
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
  error("ERROR on binding");

listen(sockfd,5);

printf("Port no. is %d",ntohs (serv_addr.sin_port));
close(sockfd);

【问题讨论】:

  • 为什么将sin_port 设置为htons(INADDR_ANY) 而不是0?从语义上讲,这没有意义。此外,您应该使用getsockname 来查找您的服务器正在侦听的实际套接字。

标签: c++ sockets


【解决方案1】:

您似乎在发明自己的语义。

如果您查看bind(2) manpage,您会看到第二个参数是const struct sockaddr *addr,但您希望在调用bind() 后它会更新。

请参阅此SO question,了解如何确定在bind() 中分配了哪个端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2019-07-31
    • 2019-01-31
    • 2018-03-15
    • 2016-01-13
    相关资源
    最近更新 更多