2013-04-08 80 views
0

我正在处理将可用端口绑定到TCP套接字的分配。最初,当我编写我的服务器代码时,我为系统设置了一个预定义的端口以进行监听,并且此功能完美无缺。但是,在将我的代码转换为绑定到打开的端口并打印正在使用的端口后,我无法通过telnet连接到服务器。C:将打开的端口绑定到套接字的问题

当我将代码转换回使用预定义的端口时,我遇到了另一个有趣的异常。再一次,服务器按预期在预定义的端口上工作,但是,它报告使用的端口与我分配的端口不同。

这第一个代码片段创建一个套接字并使用预定义的端口(32000)。

/*Create TCP socket with a predefined port*/ 
listener = socket(AF_INET, SOCK_STREAM, 0); 
if(listener == -1) { 
    perror("Create socket"); 
    exit(1); 
}/*End if*/ 

bzero(&servaddr, sizeof(servaddr));/*Set serraddr to 0's*/ 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*Any of this host's interfaces is OK.*/ 
servaddr.sin_port = htons(32000); 
bind(listener, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
length = sizeof(servaddr); 
/*getsockname(listener, (struct sockaddr *)&servaddr, &length);/*Find out port number*/ 
printf("RSTREAM:: assigned port number %d\n", servaddr.sin_port); 

这第二个代码片段使用一个可用的端口。我尝试将servaddr.sin_port设置为0,因为我读到这样做意味着系统将提供可用端口。我也尝试过评论这一行,但结果是一样的。

/*Create TCP socket with an open port*/ 
listener = socket(AF_INET, SOCK_STREAM, 0); 
if(listener == -1) { 
    perror("Create socket"); 
    exit(1); 
}/*End if*/ 

bzero(&servaddr, sizeof(servaddr));/*Set serraddr to 0's*/ 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*Any of this host's interfaces is OK.*/ 
servaddr.sin_port = htons(0);/*bind() will provide unique port.*/ 
bind(listener, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
length = sizeof(servaddr); 
getsockname(listener, (struct sockaddr *)&servaddr, &length);/*Find out port number*/ 
printf("RSTREAM:: assigned port number %d\n", servaddr.sin_port); 
+0

'是否正在打印netstat'(或类似的工具)显示端口上侦听的应用程序? – Chad 2013-04-08 04:16:02

回答

3

您需要打印转换后的端口号,也就是你需要做的ntohs(3)

printf("RSTREAM:: assigned port number %d\n", ntohs(servaddr.sin_port));