【发布时间】:2011-06-05 19:23:06
【问题描述】:
我正在做一个客户端-服务器语音聊天程序(非托管 C++,win32),其中客户端使用 TCP 连接到服务器,文本聊天/聊天室功能在 TCP 中完成,而所有音频传输都通过单独的 UDP/RTP 套接字发送(使用来自 JRTPLIB 的 API)。
所以从TCP连接知道IP,建立连接后就可以发送RTP套接字的端口号了。
问题在于,在 TCP 中,自从您建立连接以来,只有服务器需要进行端口转发才能双向进行通信,而在 UDP 中,您必须使用 recvfrom() - afaik 需要端口首先在客户端打开,这是我不想要的(如果您查看任何多人游戏或 VoIP 客户端,则不需要)
阅读有关 UDP Hole Punching 的资源(例如 http://en.wikipedia.org/wiki/UDP_hole_punching),例如,他们不断提到开始与服务器进行 udp 对话。就是这样——你如何在客户端不必打开任何端口的情况下与服务器实际开始 udp 对话(双向)?在 TCP 中,正如我提到的,您只需要 connect() 到服务器,就可以双向通信。
另外——我知道 RTP 是基于 UDP 构建的,但是关于 RTP 打孔(同样,使用 JRTPLIB)还有什么我应该知道的与 UDP 不同的吗?
提前致谢!
【问题讨论】:
-
我有点困惑 - 为 NAT Traversal 完成了 UDP 打孔,即当您需要连接点对点并且两个点都位于专用网络(或路由器)时。服务器仅用作“配对”两个客户端的一种方式。这就是你想要做的吗?
-
我正在尝试在连接到服务器的客户端之间实现 UDP/RTP 连接,而无需客户端打开任何端口。据我了解,客户端与服务器交换 IP/端口,然后服务器在客户端之间共享它,以便它们可以直接相互通信
-
“开放任何端口”是什么意思?必须打开端口才能进行通信,这就是 udp 打孔的作用。
-
那么网络游戏和ventrilo/skype是如何实现通信的呢?在这些应用程序中,您不需要为 UDP 通信打开任何端口
-
@KaiserJohaan 客户端必须发送第一个 UDP 数据包。这会“打开”客户端网关中的端口,因此它可以从服务器接收数据。
标签: c++ network-programming udp rtp hole-punching