2010-06-16 123 views
3

关于验证套接字端口的可访问性和可访问性的主题已有otherquestions检查C/C++中的开放端口

如何寻找一个端口在C/C++中动态侦听?

的基本过程,我试图完成的是:

  1. 客户开始
  2. 客户端找到开放的端口XYZ并监听它。
  3. 客户端通过UDP数据报向服务器发送基本的'我在这里'消息到端口信息
  4. 客户端和服务器可以通信。

我知道你可以完成这样的事情,如果你选择一个任意的端口号,并尝试bind ing。如果失败,请增加数字并重试,直到获得成功的“绑定”。

有没有更好的方法来做到这一点?这似乎有点哈克。

+0

在消息内发送端口号会破坏NAT防火墙后面的客户端,所以不要这样做。只需让服务器使用消息到达的端口即可。 – 2010-06-16 20:22:25

+0

这是哪种操作系统? – 2010-06-16 20:29:18

+0

@David Windows现在,但希望它最终也可以移植到Linux。 – 2010-06-16 20:31:22

回答

12

如果绑定到端口0,则会分配一个随机端口。然后getsockname()可用于找出使用的实际端口。

+1

这将工作。但肖恩,不要在UDP消息中发送端口号。这将打破NAT。只需让服务器响应消息到达的端口即可。 – 2010-06-16 20:21:31

+0

@赞NAT不会成为一个问题。它只会用在同一网段上的元素之间。 – 2010-06-16 20:23:47

+0

+1当客户端处于被动模式时,这也被FTP服务器使用 – INS 2010-06-16 20:41:02