c ++打孔UDP(RTP)

我正在做客户端 - 服务器语音聊天程序(非托管C ++,win32),其中客户端使用TCP连接到服务器,textchat / chatroom功能在TCP中完成,而所有audiotransmission都通过单独的UDP / RTP套接字发送(使用API来自JRTPLIB)。 因此,从TCP连接中可以知道IP,并且可以在建立连接后发送RTP套接字的端口号。 问题是在TCP中,只有服务器需要进行端口转发才能使通信在建立连接时双向工作,而在UDP中你必须使用recvfrom() - 这需要在端口中打开端口客户端的第一名,我不想要(如果您查看任何多人游戏或VoIP客户端则不需要) 阅读有关UDP打孔的消息来源(例如http://en.wikipedia.org/wiki/UDP_hole_punching),他们继续提到与服务器开始udp对话。那就是 - 你如何在没有客户端打开任何端口的情况下与服务器实际开始udp对话(两种方式)?在我提到的TCP中你只需要连接()到服务器,并且两种方式都可以进行通信。 另外 - 我知道RTP建立在UDP上,但是我还应该知道关于RTP打孔(再次使用JRTPLIB)的任何其他内容,使其与UDP不同吗? 提前致谢!     
已邀请:
“打开港口”有两种可能的定义。一个是打开一个带有bind()的端口用于UDP或listen()用于TCP,另一个用于打开防火墙中的端口。 你需要打开一个带有API调用的端口才能收到东西,没有办法解决它,但你可能意识到这一点,所以我认为你的意思是在防火墙中打开一个端口。但是,您不需要在启动通信的一方(客户端)执行此操作。这适用于TCP和UDP,除非您的防火墙设置为非常偏执的模式。如果之前有一个数据报从该端口发送到同一服务器,任何合理的防火墙都允许从服务器到UDP端口的响应。如果双方都在NATing防火墙/路由器后面,你只需要打孔。 Skype就是这样做的。 而且,你甚至不必费心recvfrom()和这样的东西。你可以绑定()一个UDP套接字,然后使用connect()和recv()/ send()或read()/ write(),就像你使用TCP一样。     

要回复问题请先登录注册