【问题标题】:Controlling which Network Card TCP/IP message are sent on控制在哪个网卡 TCP/IP 消息上发送
【发布时间】:2008-09-08 11:31:22
【问题描述】:

我目前正在使用的系统由一台运行 XP 的控制器 PC 组成,其中 .Net 2 连接到一组嵌入式系统。所有这些组件都通过以太网相互通信。我目前在 XP 计算机上使用 TcpClient.Connect 打开与嵌入式系统的连接以发送 TCP/IP 消息。

我现在必须将 XP 计算机连接到外部网络以发送处理数据,因此 XP 计算机上现在有两个网卡。但是,发送到外部网络的消息不能出现在将嵌入式系统连接在一起的网络上(不想消耗带宽),并且发送到嵌入式系统的消息不能出现在外部网络上。

所以,我的断言是,当使用 TcpClient.Connect 方法时,发送到定义的 IP 地址的消息会在两个网卡上发送出去。

如何指定通过哪些物理网卡消息发送,最好使用 .Net 网络 API。如果 .Net 中不存在这样的方法,那么我总是可以 P/Invoke Win32 API。

滑雪

【问题讨论】:

  • 这不取决于您要访问的 IP 地址吗?还是它们在同一个子网中?
  • @sven:外部网络(不是嵌入式网络)的 IP 地址完全不受我控制。该网络上的策略取决于将使用机器的站点的系统管理员(它可以是静态地址、dhcp、相同的子网、不同的子网、运营商 pidgeon 等)。

标签: c# .net networking


【解决方案1】:

尝试为您的客户端使用 Socket 而不是 TcpClient 类。

然后你可以使用 Socket.Bind 来定位你的本地网络适配器

    int port = 1234;

    IPHostEntry entry = Dns.GetHostEntry(Dns.GetHostName());

    //find ip address for your adapter here
    IPAddress localAddress = entry.AddressList.FirstOrDefault();

    IPEndPoint localEndPoint = new IPEndPoint(localAddress, port);

    //use socket instead of a TcpClient
    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    //binds client to the local end point
    client.Bind(localEndPoint);

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx

【讨论】:

  • 我会调查的。它当然看起来很有希望。与嵌入式网络的连接是固定的,因此通过排除过程,应该可以找到另一个适配器的 IP 地址。
【解决方案2】:

如果您的机器上有两个网卡,那么应该没有问题。正常的 IP 行为应确保您的“私有”网络(在这种情况下为嵌入式系统)的流量与您的公共网络分开,而您无需在代码中执行任何操作。所需要做的就是让两个网络位于不同的 IP 子网上,并将您的“公共”网卡设为默认网卡。

假设你的两个网卡配置如下:

NIC A (Public): 192.168.1.10 mask 255.255.255.0
NIC B (Private): 192.168.5.10 mask 255.255.255.0

您需要验证的唯一配置是 NIC A 是您的默认配置。当您尝试将数据包发送到私有网络中的任何地址(192.168.50.0 - 192.168.50.255)时,您的 IP 堆栈将查看路由表并看到直接连接的网络,并通过私有 NIC 转发流量。到(直接连接的)公共网络的任何流量都将发送到 NIC A,发送到您在路由表中没有更具体路由的任何地址的流量也将发送到。

您的路由表 (netstat -rn) 应如下所示:

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1     192.168.1.10    266 <<--
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      169.254.0.0      255.255.0.0         On-link      192.168.1.10    286
  169.254.255.255  255.255.255.255         On-link      192.168.1.10    266
      192.168.1.0    255.255.255.0         On-link      192.168.1.10    266
     192.168.1.10  255.255.255.255         On-link      192.168.1.10    266
    192.168.1.255  255.255.255.255         On-link      192.168.1.10    266
      192.168.5.0    255.255.255.0         On-link      192.168.5.10    266
     192.168.5.10  255.255.255.255         On-link      192.168.5.10    266
    192.168.5.255  255.255.255.255         On-link      192.168.5.10    266
   255.255.255.255  255.255.255.255        On-link      192.168.1.10    276
   255.255.255.255  255.255.255.255        On-link      192.168.5.10    276
===========================================================================

还有一些多播路由(以 224 开头),为简洁起见已省略。 '

【讨论】:

    【解决方案3】:

    基本上,一旦 TcpClient.Connect 方法成功,它就会在嵌入式系统的物理 MAC 地址和它应该采取的到该地址的路由(即使用哪个网卡)之间创建一个映射。

    我不相信所有通过 TcpClient 连接发送的消息都会通过两个网卡发送出去。

    您是否有任何数据可以提出其他建议,或者您只是在猜测?

    【讨论】:

    • 我不太了解网络的内部运作,所以我只是猜测。有问题的机器位于几英里外,我希望能够在其上获得一个时隙,将嗅探器插入“外部网络”适配器(即嵌入式系统未连接的适配器)并查看出来的是什么。没有什么比硬数据更好的了。
    【解决方案4】:

    Xp 维护一个路由表,它将 IP 地址范围映射到网络和网关。

    您可以使用“路由打印”查看表格,使用“路由添加”可以将路由添加到您的嵌入式设备。

    【讨论】:

    • Siebenga:我厌倦了带有无线和有线适配器的笔记本电脑上的“路由打印”命令,所有目的地都列出了两次,每个适配器一次。不过有用的工具。
    猜你喜欢
    • 2012-06-03
    • 2012-10-09
    • 2016-05-12
    • 2014-08-02
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多