【发布时间】: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来查找您的服务器正在侦听的实际套接字。