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

发布于 2024-11-30 09:19:51 字数 492 浏览 4 评论 0原文

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

All of the tutorials and examples I find online always specify a port number like 7000 or 4950 etc. What if those ports are open on one computer, but another? Seems like that case makes doing that a bad idea. Is there a way to say "find and use any open port"? My code now is like this -

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

with port being 4950. This is for a tcp socket, but I'm assuming it will be the same general strategy for udp?

Also quick question - if I am using both tcp and udp connections in an application, should they use different ports? (didn't feel like this deserved another question)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清浅ˋ旧时光 2024-12-07 09:19:51

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

并非如此,请参见下文。

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

当然,您可以不绑定或将NULL作为端口传递。但是,客户端如何知道连接到哪里?您必须在某处发布此信息。

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

引用 TLPI 的一段话:

除了将服务器的套接字绑定到
众所周知的地址。例如,对于 Internet 域套接字,
服务器可以省略对bind()的调用并简单地调用listen(),这
导致内核为该套接字选择一个临时端口。

之后,服务器可以使用getsockname()来检索地址
其插座。在这种情况下,服务器必须发布该信息
地址
,以便客户端知道如何定位服务器的套接字。这样的
发布可以通过注册服务器地址来完成
集中式目录服务应用程序,客户可以通过该应用程序进行联系
以便获取地址。

回到你的问题:

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

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

Seems like that case makes doing that a bad idea

Not so, see below.

Is there a way to say "find and use any open port"?

Sure, you could just not bind or pass NULL as port. But then, how would the clients know where to connect to ? You would have to publish this information somewhere.

Back to bind(2). If you specify a port of 0 the kernel chooses an ephemeral port when bind is called.

Here's a quote from TLPI:

There are other possibilities than binding a server’s socket to a
well-known address. For example, for an Internet domain socket, the
server could omit the call to bind()
and simply call listen(), which
causes the kernel to choose an ephem- eral port for that socket.

Afterward, the server can use getsockname() to retrieve the address
of its socket. In this scenario, the server must then publish that
address
so that clients know how to locate the server’s socket. Such
publication could be done by registering the server’s address with a
centralized directory service application that clients then contact in
order to obtain the address.

Back to your questions:

Also quick question - if I am using both tcp and udp connections in an
application, should they use different ports

Not necessarily. They don't "get mixed up".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文