A bind with a port of zero will bind you to a free port. Is this portable? [closed]

此生再无相见时 提交于 2019-12-22 07:37:09

问题


I want my program to bind to a free port.

Google told me that a bind with port=0 will do that, but I haven't found if this is guaranteed to work on any system (Windows/Linux in particular).

Can someone link a doc that say that?


回答1:


It's universal as far as I know, but I can't find any text in the standards that says it is. An alternative that might be more portable is using getaddrinfo with null service name pointers and the AI_PASSIVE flag. This is guaranteed to give you an sockaddr you can bind to. It's also the correct way to let the administrator choose which local ip (v4 or v6) address to bind to.




回答2:


It's certainly "standard" in the 4.2BSD socket API from which most every other implementation is derived, but I'm not aware of any formal specification that actually says so.




回答3:


It's standard, documented behavior for AF_INET address family:

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

See ip_local_port_range, which contains the following:

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



回答4:


#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;
}


来源:https://stackoverflow.com/questions/5895751/a-bind-with-a-port-of-zero-will-bind-you-to-a-free-port-is-this-portable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!