2013-12-19 69 views
-1

我需要将服务器绑定到一个动态端口(使用ephermal端口),但是当被指定的端口为0(这意味着任何随机端口)调用来结合()将服务器总是绑定到端口0bind()服务器套接字到任何端口总是给端口号。 0

//示例代码段

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); 
+2

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

回答

2

你似乎被自己发明的语义。

如果你看看bind(2) manpage,你会看到第二个参数是const struct sockaddr *addr,但你期望在致电bind()之后它会被更新。

查看此SO question了解如何确定在bind()内分配了哪个端口。