3

先来点背景。我在局域网中的每台机器上都安装了一个 .net 客户端代理。他们也在同一个局域网上与我的中央服务器 [网站] 进行交互。

对于我的网站来说,弄清楚哪些机器可以相互通信很重要。例如,一个子网的机器如果不配置路由器等,就不能直接与另一个子网的机器通信。但是同一子网中的机器应该能够直接相互通信。

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

图1

因为 Comp1、Comp2 和 Comp3 在路由器后面,所以它们的 IP 地址为 192.168.1.2 到 192.168.1.4。我在这些机器上的客户端代理将相同的 IP 地址报告给服务器。但是,计算机 Comp4、Comp5 也具有相同的 ipaddresses。

因此,就我的服务器而言,有 2 台机器具有相同的 IP 地址。不仅如此,因为所有机器的子网掩码都是 255.255.255.0,所以我的服务器误以为 Comp1 可以直接与 Comp5 通信,这是不可能的。

那么,我该如何解决呢?我需要在客户端或服务器中进行哪些更改,以便支持这种情况。这两个是我唯一能控制的。

4

3 回答 3

3

编辑:似乎网络图过于简化,可能有多个路由器/子网级别。我原来的答案不会处理这种情况。此外,由于只能修改客户端应用程序或服务器应用程序并且不篡改路由器和防火墙,这使得它变得更加困难。

EDIT2:使用“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

“远程地址”区分子网。

因此,您需要弄清楚的是如何提取客户端连接的远程地址。如果您正在为您的服务器应用程序使用任何流行的 Web 技术,那么这非常容易。

于 2010-04-22T10:00:58.383 回答
1

一种方法是让各个客户端计算机使用广播消息来确定他们可以看到谁。让每个客户端监听某个特定的 UDP 端口,每个客户端将其存在广播到本地广播域。当客户端可以通过这种方式相互看到时,它们可能也可以相互建立 TCP 连接。

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

于 2010-04-22T09:58:09.407 回答
0

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

我可以建议的解决方案是探测。客户端从服务器接收所有其他客户端的列表,并尝试与每个客户端建立连接。我认为,假设网络中有任意数量的路由器/防火墙/NAT,这是了解哪些客户端真正可访问的唯一方法。当然,对于大量计算机而言,它的扩展性并不大。

于 2010-04-27T00:05:43.213 回答