5

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

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

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

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

斯基兹

4

4 回答 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

于 2008-09-08T12:06:34.617 回答
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,发送到您在路由表中没有更具体路由的任何地址的流量也将发送到 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 开头),为简洁起见已省略。'<<--' 表示默认路由,应该使用公共接口。

于 2008-09-13T22:11:19.863 回答
1

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

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

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

于 2008-09-08T11:36:43.487 回答
1

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

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

于 2008-09-08T11:57:21.767 回答