控制发送哪个网卡TCP / IP消息

时间:2020-03-05 18:49:17  来源:igfitidea点击:

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

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

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

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

斯基兹

解决方案

回答

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

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

我们是否有其他建议的数据,或者我们正在猜测?

回答

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

我们可以使用"路由打印"来查看表格,通过"路由添加"可以向嵌入式设备添加路由。

回答

尝试为客户端而不是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行为应确保"专用"网络(在这种情况下为嵌入式系统)的流量与公共网络分开,而无需执行代码中的任何操作。只需要将两个网络放在不同的IP子网中,并将"公共" 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,并且到路由表中没有特定路由的任何地址的流量也将发送到NICA。

路由表(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开始)。 " <<-"表示默认路由,应使用公共接口。