控制TCP/IP消息发送的网络卡是哪张

5
我当前工作的系统由一台运行XP和.Net 2的控制器PC连接到一组嵌入式系统。所有这些组件都通过以太网通信。我目前在XP计算机上使用TcpClient.Connect打开与嵌入式系统的连接以发送TCP/IP消息。
现在,我需要将XP计算机连接到外部网络以发送处理数据,因此XP计算机上有两张网络卡。但是,发送到外部网络的消息不能出现在连接嵌入式系统的网络上(不想消耗带宽),而发送到嵌入式系统的消息也不能出现在外部网络上。
因此,我的断言是使用TcpClient.Connect方法发送到定义的IP地址的消息会同时发送到两张网络卡上。
如何指定通过哪个物理网络卡发送消息,最好使用.Net网络API。如果在.Net中不存在这样的方法,则可以调用Win32 API。
Skizz

这不取决于您想要到达的IP地址吗?还是它们在同一个子网中? - sven
@sven:外部网络的IP地址(而非嵌入式网络)完全不受我的控制。该网络的策略由将使用该机器的站点的系统管理员决定(可能是静态地址、DHCP、同一子网、不同子网、信鸽等)。 - Skizz
4个回答

7
尝试使用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地址。 - Skizz

2
如果您的计算机上有两张网络卡,那么这应该不会成为问题。正常的IP行为应确保您“私有”网络(在本例中是嵌入式系统)的流量与公共网络分开,而无需在代码中进行任何操作。所有需要的就是两个网络位于不同的IP子网,并且您的“公共”NIC是默认设置。
假设您的两个NIC配置如下:
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开头的多播路由被省略了。'<<--' 表示默认路由,应使用公共接口。


1
基本上,一旦TcpClient.Connect方法成功,它将创建一个映射,将嵌入式系统的物理MAC地址与应该采取的路由(即使用哪个网络卡)联系起来。
我不相信所有通过TcpClient连接发送的消息都会通过两张网络卡发送。
你有任何数据表明否,还是只是猜测?

我对网络的内部运作并不是很了解,所以我只是猜测而已。这台机器位于离这里几英里远的地方,我希望能够在上面获得一个时间段,将嗅探器插入“外部网络”适配器(即嵌入式系统未连接的适配器),看看会有什么输出。没有什么比硬数据更有说服力了。 - Skizz

1
Xp维护一个路由表,将IP地址范围映射到网络和网关。您可以使用“route print”查看该表,使用“route add”可以向嵌入式设备添加路由。

Siebenga: 我在一个带有无线和有线适配器的笔记本电脑上尝试了“route print”命令,所有目标都会列出两次,每个适配器一次。虽然如此,这是一个有用的工具。 - Skizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接