BSD - 使用任何可用的端口?

时间:2011-08-16 16:48:52

标签: c sockets port bind bsd

我在网上找到的所有教程和示例总是指定一个端口号,如7000或4950等。如果这些端口在一台计算机上打开,但另一台端口打开怎么办?似乎这种情况使得这样做很糟糕。有没有办法说“找到并使用任何开放端口”?我现在的代码是这样的 -

//get server info, put into servinfo
if ((status = getaddrinfo("192.168.2.2", port, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
    return false;
}

端口为4950.这是一个tcp套接字,但我假设它将是udp的相同的一般策略?

同样快速的问题 - 如果我在应用程序中同时使用tcp和udp连接,它们应该使用不同的端口吗? (不觉得这应该是另一个问题)

1 个答案:

答案 0 :(得分:2)

  

似乎这种情况使得这样做是个坏主意

不是这样,见下文。

  

有没有办法说“找到并使用任何开放端口”?

当然,你可能不会bind或将NULL作为port传递。但是,客户如何知道连接到哪里?您必须在某处发布此信息。

返回bind(2)。如果指定端口0,则在调用bind时内核会选择一个临时端口。

以下是TLPI的引用:

  

除了将服务器的套接字绑定到a之外,还有其他可能性   知名地址。例如,对于Internet域套接字,   服务器可以省略对bind()的调用,只需调用listen()即可   导致内核为该套接字选择一个ephem-port端口。

     

之后,服务器可以使用getsockname()来检索地址   它的插座。在这种情况下,服务器必须然后发布它   地址,以便客户端知道如何找到服务器的套接字。这样   可以通过注册服务器的地址来完成发布   客户端随后联系的集中式目录服务应用程序   为了获得地址。

回到你的问题:

  

同样快速的问题 - 如果我在同时使用tcp和udp连接   应用程序,他们应该使用不同的端口

不一定。他们不会“混淆”。