我在网上找到的所有教程和示例总是指定一个端口号,如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连接,它们应该使用不同的端口吗? (不觉得这应该是另一个问题)
答案 0 :(得分:2)
似乎这种情况使得这样做是个坏主意
不是这样,见下文。
有没有办法说“找到并使用任何开放端口”?
当然,你可能不会bind
或将NULL
作为port
传递。但是,客户如何知道连接到哪里?您必须在某处发布此信息。
返回bind(2)
。如果指定端口0
,则在调用bind时内核会选择一个临时端口。
以下是TLPI的引用:
除了将服务器的套接字绑定到a之外,还有其他可能性 知名地址。例如,对于Internet域套接字, 服务器可以省略对bind()的调用,只需调用listen()即可 导致内核为该套接字选择一个ephem-port端口。
之后,服务器可以使用
getsockname()
来检索地址 它的插座。在这种情况下,服务器必须然后发布它 地址,以便客户端知道如何找到服务器的套接字。这样 可以通过注册服务器的地址来完成发布 客户端随后联系的集中式目录服务应用程序 为了获得地址。
回到你的问题:
同样快速的问题 - 如果我在同时使用tcp和udp连接 应用程序,他们应该使用不同的端口
不一定。他们不会“混淆”。