代码之家  ›  专栏  ›  技术社区  ›  Amith George

根据IP地址唯一地识别路由器后面的机器

  •  3
  • Amith George  · 技术社区  · 15 年前

    先了解一些背景。我在局域网中的每台计算机上都安装了.NET客户端代理。它们也在同一局域网上与我的中央服务器[网站]交互。

    对于我的网站来说,找出哪些机器可以互相交谈是很重要的。例如,如果不配置路由器等,一个子网的计算机无法直接与另一个子网的计算机对话。但是同一个子网中的机器应该能够直接相互通信。

    我面临的问题是当局域网设置如图1所示时。

    Figure 1 http://www.freeimagehosting.net/uploads/3105becc0a.png

    因为comp1、comp2和comp3在路由器后面,所以它们的IP地址是192.168.1.2到192.168.1.4。这些机器上的客户机代理向服务器报告相同的IP地址。但是,计算机comp4、comp5也有相同的IP地址。

    因此,就我的服务器而言,有两台机器具有相同的IP地址。不仅如此,因为所有机器的子网掩码都是255.255.255.0,所以我的服务器被愚弄到认为COMP1可以直接与COMP5对话,这是不可能的。

    那么,我该如何解决这个问题呢?我需要在客户机或服务器中更改什么,以便支持这个场景。这两件事是我唯一能控制的。

    3 回复  |  直到 15 年前
        1
  •  3
  •   zaf    15 年前

    编辑 :网络图 太简单了,可能 多个路由器/子网级别。我的 原始答案无法处理此问题 脚本。还有,有了限制 只修改客户端应用程序或服务器 应用程序,不篡改 路由器和防火墙 更难。

    编辑2 :使用“arp-a”可以提取 路由器的MAC地址。如果 客户端应用程序可以做到这一点 难题是 解决了的 !

    客户端应用程序知道本地机器地址并将其传递给服务器应用程序。

    服务器应用程序在连接进入时知道远程地址。这可能是机器地址或路由器地址。

    从这两个价值观中,你可以算出你的要求。

    例如:

    Server app receives connection from 10.10.10.2 with client supplying 192.168.1.2
    
    Server app receives connection from 10.10.10.3 with client supplying 192.168.1.3
    

    “远程地址”区分子网。

    所以,您需要了解的只是如何提取客户机连接的远程地址。如果你正在为你的服务器应用程序使用任何流行的网络技术,那么这是非常容易的。

        2
  •  1
  •   Greg Hewgill    15 年前

    一种方法是让单个客户机使用 广播 消息。让每个客户机监听某个特定的UDP端口,并且每个客户机将其存在广播到本地广播域所在的任何位置。当客户机以这种方式看到彼此时,他们可能也可以建立彼此的TCP连接。

    如果服务器需要知道哪些客户机可以相互通信,只需让客户机告诉服务器即可。

        3
  •  0
  •   Fedor    15 年前

    如果网络图足够复杂,我想很难找到你需要的东西。 您还应该考虑到comp1可以与comp6建立直接连接。

    我建议的解决办法是探索。客户机从服务器接收所有其他客户机的列表,并尝试与每个客户机建立连接。我认为,如果网络中有任何数量的路由器/防火墙/nat,那么这将是了解哪些客户机真正可以访问的唯一方法。当然,对于大量的计算机来说,规模不是很大。