Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 客户端服务器Unix套接字和端口转发_Linux_Sockets_Client Server_Portforwarding - Fatal编程技术网

Linux 客户端服务器Unix套接字和端口转发

Linux 客户端服务器Unix套接字和端口转发,linux,sockets,client-server,portforwarding,Linux,Sockets,Client Server,Portforwarding,我们正在使用Unix/Linux套接字构建聊天应用程序。目前我无法理解何时需要端口转发。我们想制作一个点对点的系统,其中聊天服务器仅用于将两个客户端连接在一起。在这之后,两个客户直接相互交谈。我的问题是,如果两个客户机正在相互交谈,那么从技术上讲,他们有一个小型侦听器等待传入的客户机连接(简单地说,他们也有一个小型服务器),在这种情况下我们需要端口转发吗?提前谢谢 问题不在于谁是服务器,谁是客户端,而在于谁开始对话 如果聊天客户端启动连接,您不需要转发端口,因为路由器知道在哪里发送数据包 如果服

我们正在使用Unix/Linux套接字构建聊天应用程序。目前我无法理解何时需要端口转发。我们想制作一个点对点的系统,其中聊天服务器仅用于将两个客户端连接在一起。在这之后,两个客户直接相互交谈。我的问题是,如果两个客户机正在相互交谈,那么从技术上讲,他们有一个小型侦听器等待传入的客户机连接(简单地说,他们也有一个小型服务器),在这种情况下我们需要端口转发吗?提前谢谢


问题不在于谁是服务器,谁是客户端,而在于谁开始对话

如果聊天客户端启动连接,您不需要转发端口,因为路由器知道在哪里发送数据包

如果服务器想要启动连接(或其他聊天客户端),他们会将数据包发送到路由器,这样路由器就需要知道客户端在哪里,所以你需要转发一个端口


TL;DR您不需要端口转发,只需告诉每个客户端另一个客户端的侦听位置。

无论两个聊天客户端如何发现彼此,在某个时刻,其中一个客户端都必须启动与另一个客户端的直接连接

让我们将这两个方面称为
连接
方面和
发布
方面(因为第一方建立了与另一方发布的IP地址的连接)

连接端的工作很简单,因为它知道发布端的外部IP地址和端口。它只需发送SYN数据包以建立连接,您的住宅路由器就会将其发送到internet。路由器将透明地NAT此连接,因此入站流量将正确路由到建立连接的机器

然而。。。
发布
端应该公开什么IP地址?如果住宅路由器后面有多台计算机,则这些计算机都具有内部IP地址(例如10.0.0.1、10.0.0.2等)。路由器有一个“真实”的外部IP地址,但是任何到那里的流量(不是NAT'd)通常都会在路由器上停止,因为它不知道去哪个内部IP地址

一种解决方案是在已知端口(例如7876)的路由器上配置端口转发。任何目的地为7876的入站数据包都将路由到配置的内部地址上的(可能不同)端口

这是非常不灵活的,许多用户无法访问,所以另一种技术是打孔-请参阅

问题中提到的“侦听器”的问题是,它需要绑定到内部IP地址。侦听器接收入站连接的唯一方式是上游路由器知道将某个端口上的流量路由到该地址/端口