1

我在网上找到的所有教程和示例总是指定一个端口号,如 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 连接,它们应该使用不同的端口吗?(不觉得这值得另一个问题)

4

1 回答 1

2

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

不是这样,见下文。

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

当然,您不能bindNULL通过port. 但是,客户端如何知道连接到哪里?您必须在某处发布此信息。

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

以下是 TLPI 的引述:

除了将服务器的套接字绑定到众所周知的地址之外,还有其他可能性。例如,对于 Internet 域套接字,服务器可以省略对 bind() 的调用,而只调用 listen(),这会导致内核为该套接字选择一个临时端口。

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

回到你的问题:

还有一个快速的问题 - 如果我在应用程序中同时使用 tcp 和 udp 连接,它们是否应该使用不同的端口

不必要。他们不会“混淆”。

于 2011-08-16T16:53:21.880 回答