networking - 在同一Intranet上区分两台计算机

标签 networking sockets ip-address

我正在尝试创建一个套接字“Hello World”程序。

理想情况下,我想创建两个可以对等交换简单文本的程序。

我可以创建一个Web服务,对等方可以将其IP地址发布到该Web服务。

然后,一个对等方可以选择另一个与之配对。

如果一个同龄人是我的台式计算机,另一个是我的笔记本电脑,我该如何区分这两个?

最佳答案

首先。如果所有这些都在您的本地网络上,而没有任何NAT网关或类似地址-没什么大不了的。您的服务器将看到具有不同IP地址的客户端,并且客户端可以直接彼此连接。

另一方面,如果您的服务器在可访问Internet的IP地址上运行,并且您的客户端从他们可以访问该服务器的任何地方进行连接,则您必须考虑本文的其余部分。

客户端A连接到您的服务器。现在之间存在联系:
(ClientAIP:ClientAPort,ServerIP:ServerPort)

客户端B连接到您的服务器。现在之间存在联系:
(ClientBIP:ClientBPort,ServerIP:ServerPort)

如果您的两个客户端都在同一个NAT网关后面,则服务器将看到ClientAIP == ClientBIP。
但是ClientAPort将不同于ClientBPort。这足以保持与服务器的两个连接。

现在,如果要将两个配对,麻烦就来了。让客户端向您发送其内部IP地址(也许也向其发送内部端口,以便可以将其用于额外的验证。)

您现在知道了客户端(外部)IP及其内部IP。
这些是方案:

  • ClientAInternalIP == ClientAIP,ClientBinternalIP == ClientBIP。太好了,都不在NAT网关的后面-选择其中一个作为服务器,再选择另一个直接连接到该服务器。
  • ClientAInternalIP!= ClientAIP,ClientBinternalIP == ClientBIP。 ClientA在NAT之后,ClientB在NAT之后。让ClientB成为服务器,让ClientA直接连接到ClientB
  • ClientAInternalIP == ClientAIP,ClientBinternalIP!= ClientBIP。只是相反的情况2)。
  • ClientAInternalIP!= ClientAIP,ClientBinternalIP!= ClientBIP,但是ClientAIP == ClientBIP。特殊情况-它们都在NAT网关后面,但是它们在同一个内部网络中。这与情况1)相同。除非客户端可以在其内部网络而不是Internet上进行通信。
  • ClientAInternalIP!= ClientAIP,ClientBinternalIP!= ClientBIP。两者都在NAT网关后面。 -您无法建立彼此的连接-至少在不要求某人在客户端的网关之一上设置端口转发的情况下。您必须通过服务器路由通信。 (尽管有一些提供API的路由器/网关,您可能可以使用它们以编程方式从客户端站点打开端口转发。它并不广泛可用,而且无论如何都可能被锁定)。

  • 即使在上述情况下,也可能设置了防火墙,因此即使客户的真实IP地址可以在Internet上路由,也无法直接对等访问客户端-无论如何,您可能仍然需要通过服务器进行路由。

    关于networking - 在同一Intranet上区分两台计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2254334/

    相关文章:

    c - 代理中的非阻塞套接字和 poll() 怪癖

    docker - 为什么我发布的端口不起作用?

    sockets - 如何确定是否已完成从UNIX套接字的read()处理?

    c# - 正在浏览我的网站的用户的 IP 地址

    python - 在python中确定CONNECTED接口(interface)(linux)的IP地址

    localization - 使用 Google 翻译插件自动翻译网站(IP 和接受语言)?

    mysql - ubuntu中如何访问本地网络其他系统的mysql数据库连接

    java - 在java中打开网站代码作为网络浏览器的错觉

    ios - 在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

    ios - socket.IO-objc 与 AZSocketIO