使用可用端口号

时间:2016-03-16 02:23:56

标签: c sockets

我正在使用c代码编写一个socket编程。我正在尝试使用任何IP地址和任何可用端口创建服务器。我用的如下:

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
serv_addr.sin_port = ntohs(0);

据我所研究,我知道如果我在bind中使用这个服务器配置,那么我将使用机器本身的可用端口号进行套接字绑定。我所做的是:

if (bind(bridgeSockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
        < 0)
    printf("ERROR on binding");

当我测试我的IP地址和端口号时,我得到如下:

IP Address: 127.0.0.1
Port Number: 0

这是完全出乎意料的我有端口号0。

这里我也提供连续代码:

struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));

// configure server information
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
serv_addr.sin_port = ntohs(0);

// bind socket with server information
if (bind(bridgeSockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
        < 0)
    printf("ERROR on binding");

// turn to passive
listen(bridgeSockfd, 5);

name = gethostbyaddr(&serv_addr.sin_addr.s_addr,
        sizeof serv_addr.sin_addr.s_addr, AF_INET);
strcpy(bridgeIP, name->h_name);
bridgePortNo = ntohs(serv_addr.sin_port);

任何人都可以帮我解决我在错误的地方从机器上进行自动端口分配而不是始终获得0。

注意:我通过虚拟机使用ubuntu操作系统。

由于

2 个答案:

答案 0 :(得分:1)

bind()不会写入sockaddr。调用getsockname()以找出它绑定的位置。

socklen_t size = sizeof(serv_addr);
getsockname(bridgeSockfd, (struct sockaddr *) &serv_addr, &size);

答案 1 :(得分:1)

gethostbyaddr()不返回侦听套接字的端口号。您应该使用getsockname()