端口为零的绑定将绑定到空闲端口。这是便携式吗?

时间:2011-05-05 09:53:35

标签: c sockets bind portability port

我希望我的程序绑定到一个自由端口。

谷歌告诉我,使用port = 0的绑定会这样做,但是我没有发现这是否可以保证在任何系统上运行(特别是Windows / Linux)。

有人可以链接说出来的文档吗?

4 个答案:

答案 0 :(得分:5)

它在4.2BSD套接字API中肯定是“标准”,大多数其他所有实现都是从这个API中派生出来的,但我并不知道任何实际上这样说的正式规范。

答案 1 :(得分:4)

据我所知,这是普遍的,但我在标准中找不到任何文字。可能更具可移植性的替代方法是使用带有空服务名称指针的getaddrinfoAI_PASSIVE标志。这可以保证为您sockaddr提供bind。这也是让管理员选择哪个本地ip(v4或v6)的正确方法 要绑定的地址。

答案 2 :(得分:2)

这是AF_INET地址系列的标准记录行为:

http://man7.org/linux/man-pages/man7/ip.7.html

请参阅ip_local_port_range,其中包含以下内容:

    An ephemeral port is allocated to a socket in the following circumstances:

          *  the port number in a socket address is specified as 0 when
             calling bind(2);

答案 3 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
int main()
{
    struct sockaddr_in addr;
    socklen_t addrLen;
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {
        printf("Failed to create socket");
    }
    addr.sin_family = AF_INET;
    addr.sin_port = 0; 
    addr.sin_addr.s_addr = INADDR_ANY; 
    if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
        printf("Failed to bind");
    }
    addrLen = sizeof(addr);
    if (getsockname(fd, (struct sockaddr *)&addr, &addrLen) == -1) {
        printf("getsockname() failed");
    }
    printf("port=%d \n", addr.sin_port);
    return 0;
}