C:将开放端口绑定到套接字的问题

C:将开放端口绑定到套接字的问题,c,sockets,C,Sockets,我正在处理一个任务,该任务涉及将可用端口绑定到TCP套接字。最初,当我编写服务器代码时,我为系统设置了一个预定义的监听端口,这非常有效。但是,在将代码转换为绑定到打开的端口并打印正在使用的端口时,我无法通过telnet连接到服务器 当我将代码转换回使用预定义端口时,我遇到了另一个有趣的异常。再一次,服务器在预定义端口上按预期工作,但是,它报告要使用的端口与我分配给它的端口不同 第一个代码段创建一个套接字并使用预定义的端口(32000) 第二个代码段使用了一个可用的端口。我尝试将servaddr.

我正在处理一个任务,该任务涉及将可用端口绑定到TCP套接字。最初,当我编写服务器代码时,我为系统设置了一个预定义的监听端口,这非常有效。但是,在将代码转换为绑定到打开的端口并打印正在使用的端口时,我无法通过telnet连接到服务器

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

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

第二个代码段使用了一个可用的端口。我尝试将servaddr.sinu 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);

您需要打印转换后的端口号,即您需要执行以下操作:


您需要打印转换后的端口号,即您需要执行以下操作:

netstat
(或类似工具)是否显示正在打印的端口上侦听的应用程序?
netstat
(或类似工具)是否显示正在打印的端口上侦听的应用程序?
/*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);
printf("RSTREAM:: assigned port number %d\n", ntohs(servaddr.sin_port));