gpt4 book ai didi

C++ 打洞 UDP(RTP)

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:05 24 4
gpt4 key购买 nike

我正在做一个客户端-服务器语音聊天程序(非托管 C++,win32),其中客户端使用 TCP 连接到服务器,文本聊天/聊天室功能在 TCP 中完成,而所有音频传输都通过单独的 UDP/RTP 套接字发送(使用来自 JRTPLIB 的 API)。

因此IP从TCP连接中获知,RTP套接字的端口号可以在连接建立后发送。

问题是,在 TCP 中,只有服务器需要进行端口转发才能使通信双向工作,因为您建立了连接,而在 UDP 中,您必须使用 recvfrom() ——afaik 需要端口首先在客户端打开,这是我不想要的(如果您查看任何多人游戏或 VoIP 客户端,则不需要)

阅读有关 UDP 打洞的资源(例如 http://en.wikipedia.org/wiki/UDP_hole_punching),例如他们不断提到开始与服务器的 udp 对话。就是这样——您实际上如何在客户端无需打开任何端口的情况下与服务器开始 udp 对话(双向)?正如我提到的,在 TCP 中,您只需要 connect() 到服务器,并且可以通过两种方式进行通信。

另外 -- 我知道 RTP 建立在 UDP 之上,但关于 RTP 打洞(同样,使用 JRTPLIB),我是否应该了解其他任何使其与 UDP 不同的内容?

提前致谢!

最佳答案

“打开一个端口”有两种可能的定义。一种是使用 bind() 为 UDP 或 listen() 为 TCP 打开一个端口,另一种是在防火墙中打开一个端口。

您需要通过 API 调用打开一个端 Eloquent 能接收某些内容,这是没有办法解决的,但您可能已经意识到这一点,所以我认为您的意思是在防火墙中打开一个端口。但是您不需要在发起通信的一方(客户端)执行此操作。这适用于 TCP 和 UDP,除非您的防火墙设置为非常偏执的模式。如果某个时间之前有数据报从该端口发送到同一服务器,则任何合理的防火墙都将允许从服务器到 UDP 端口的响应。如果双方都在 NATing 防火墙/路由器后面,则只需要打洞。 Skype 就是这样做的。

此外,您甚至不必费心使用 recvfrom() 之类的东西。您可以只 bind() UDP 套接字,然后使用 connect() 和 recv()/send() 或 read()/write() ,就像使用 TCP 一样。

关于C++ 打洞 UDP(RTP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4634780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com