c++ 打洞UDP(RTP)

标签 c++ network-programming udp rtp hole-punching

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

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

问题是,在 TCP 中,只有服务器需要进行端口转发,以便建立连接后双向通信,而在 UDP 中,您必须使用 recvfrom() ——据我所知,这需要端口首先在客户端打开,这是我不想要的(如果您查看任何多人游戏或 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/

相关文章:

c# - 如何减少远程 SQL Server 负载?

network-programming - urllib.request.urlopen(url) 如何使用此函数与ip地址?

cocoa - Cocoa中用于检测机器的框架/函数是什么

C++ - 多线程 - 线程之间的通信

c++ - 为什么 Windows 的 gflags 不会因这段代码而崩溃?

sockets - 流读取阻止UDP GNAT

c# - 串行到以太网 (TCP) 字节传输的显着延迟?

c - 如何关闭在recvfrom上阻塞的UDP套接字

c++ - C 到 C++ 转换器

c++ - 错误 char 和 const char