我需要将我的服务器绑定到动态端口(使用ephermal端口),但是当端口指定为0(这意味着任何随机端口)始终将服务器绑定到端口0时,调用bind()。
//示例代码段
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);
答案 0 :(得分:2)
你似乎在发明自己的语义。
如果您查看bind(2)
manpage,您会看到第二个参数为const struct sockaddr *addr
,但您希望在调用bind()
后更新它。
请参阅此SO question,了解如何确定bind()
内分配的端口。