C++ 私人与公共港口

C++ 私人与公共港口,c++,winapi,sockets,udp,winsock,C++,Winapi,Sockets,Udp,Winsock,我有一个艰难的时间与私人和公共udp端口。我正在做一个客户机-服务器VoIP程序,有一些问题 1) 专用端口就是您在bind()中使用的端口,对吗 2) 公共端口由防火墙分配,对吗?因为它是本地网络外部可见的端口 3) 当我在本地网络上的两台机器之间调试时,我将两者都指定为发送/接收到专用端口,并且通信正常。如果我要与网络之外的客户机通信,我会使用公共端口,对吗 4) 本地网络上的两台主机是否可以通过公共端口进行通信?因为这就是它在发布模式下的表现,所以最好确保它能正常工作 5) 路由器会将发送

我有一个艰难的时间与私人和公共udp端口。我正在做一个客户机-服务器VoIP程序,有一些问题

1) 专用端口就是您在bind()中使用的端口,对吗

2) 公共端口由防火墙分配,对吗?因为它是本地网络外部可见的端口

3) 当我在本地网络上的两台机器之间调试时,我将两者都指定为发送/接收到专用端口,并且通信正常。如果我要与网络之外的客户机通信,我会使用公共端口,对吗

4) 本地网络上的两台主机是否可以通过公共端口进行通信?因为这就是它在发布模式下的表现,所以最好确保它能正常工作

5) 路由器会将发送到公共端口的数据包转发到专用端口上的应用程序列表吗?因此,发送方(如果在本地网络之外)指定公共端口而不是专用端口

希望这是清楚的,否则就去问吧

提前谢谢! 约翰

1) 专用端口是您使用的端口 在bind()中,对吗

2) 公共端口由 防火墙,对吗?因为它是港口 在我的本地网络外可见

嗯,是的,但它不完全是防火墙。是NAT。当然,NAT可以(而且通常是)在防火墙中实现,但也有不使用任何NAT的防火墙。另外需要注意的是,您可能有多个级别的NAT(比如一个在家,一个在ISP),在这种情况下,将最外层NAT分配的端口称为公共端口可能是有意义的

3) 当我在两台计算机之间调试时 本地网络上的机器,我是 指定两者都要发送/接收到 私人港口和通讯工程。 如果我要和一个 我将使用网络之外的客户端 公共港口,对吗

这取决于网络设置。既然您在问题中提到了“客户机-服务器”,我假设客户机“连接”(发送第一个数据包)到服务器。如果服务器不支持任何NAT,则其公共IP/端口对将与本地IP/端口对相同。但是如果服务器在NAT后面,那么您不能仅仅连接到它,因为它还没有分配公共端口。仅仅打开一个端口并不会导致NAT分配一个公共端口,您实际上需要从该端口发送一些东西

因此,如果您的服务器在NAT后面,那么它必须充当客户端,并且客户端必须充当服务器,前提是客户端也不在NAT后面。如果双方都支持NAT,则需要第三方非NAT服务器来执行。请注意,在使用打孔时,通常会同时使用私有和公共端点,以防双方碰巧位于同一LAN中

4) 有没有办法让两台主机同时运行 要在其上进行通信的本地网络 公共港口?因为那是什么 它将处于释放模式,是吗 最好确保它能正常工作

这取决于NAT设置。它可以忽略来自局域网内部的所有信息,并将NAT的公共地址作为目的地。例如,我甚至不能从我的家用电脑上ping我自己的公共地址

5) 路由器会转发数据包吗 发送到公共端口到 私有网络上的应用程序列表 港口?因此,发送方(如果在 本地网络)指定公共 端口,而不是专用端口


见我对第3条的回答。当然,一旦分配了公共端口,它就会转发数据包,因为这是它首先分配的目的。但它可能会检查传入的数据包是否来自导致端口打开的数据包发送到的同一地址和端口,因此这是对先前发送的数据包的有效响应,而不仅仅是一些试图闯入的随机黑客。

我们的想法是使用holepunching,抱歉,我应该提到这一点。客户端向服务器发送数据包,然后服务器将端口信息和ip转发给其他客户端。服务器不支持NAT(通过端口转发)。但是您提到,输入数据包的地址必须与我们发送的数据包的地址相同。我明白为什么,但这难道不能阻止打孔吗?我的意思是,打孔的想法是,客户机向服务器打开公共端口,然后服务器告诉客户机彼此的情况,这样客户机就可以在这些端口上相互交谈。@Kaiser,为什么这会阻止打孔呢?当然,当一个客户端向另一个客户端发送数据报时,它可能会被丢弃。但是另一个客户端将发送回复(它通过服务器知道有通信尝试),这一次它将通过——因为第一方的NAT认为这是对先前发送的数据包的回复(并且被另一方丢弃,但第一方的NAT不知道)。不过,你应该阅读我提供链接的那篇文章,因为打孔还有很多。