5

私が現在取り組んでいるシステムは、一連の組み込みシステムに接続された .Net 2 を備えた XP を実行するコントローラー PC で構成されています。これらのコンポーネントはすべて、イーサネット ネットワークを介して相互に通信します。現在、XP コンピュータで TcpClient.Connect を使用して組み込みシステムへの接続を開き、TCP/IP メッセージを送信しています。

XP コンピュータを外部ネットワークに接続して処理データを送信する必要があるため、XP コンピュータには 2 つのネットワーク カードがあります。ただし、外部ネットワークに送信されるメッセージは、組み込みシステムを相互に接続するネットワークに表示されてはならず (帯域幅を消費したくない)、組み込みシステムへのメッセージは外部ネットワークに表示されてはなりません。

つまり、TcpClient.Connect メソッドを使用すると、定義された IP アドレスに送信されたメッセージが両方のネットワーク カードで送信されるということです。

理想的には .Net ネットワーク API を使用して、どの物理ネットワーク カード メッセージが送信されるかを指定するにはどうすればよいですか。そのようなメソッドが .Net に存在しない場合は、いつでも Win32 API を P/Invoke できます。

スキズ

4

4 に答える 4

7

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

マシンにネットワーク カードが 2 枚ある場合、問題はありません。通常の IP 動作では、コードで何もしなくても、「プライベート」ネットワーク (この場合は組み込みシステム) のトラフィックがパブリック ネットワークから分離されるようにする必要があります。必要なのは、2 つのネットワークが異なる IP サブネット上にあり、「パブリック」NIC がデフォルトであることだけです。

2 つの 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 から始まる) もいくつかあります。「<<--」は、パブリック インターフェイスを使用するデフォルト ルートを示します。

于 2008-09-13T22:11:19.863 に答える
1

基本的に、TcpClient.Connect メソッドが成功すると、組み込みシステムの物理 MAC アドレスとそのアドレスへのルート (つまり、使用するネットワーク カード) との間のマッピングが作成されます。

TcpClient接続を介して送信されたすべてのメッセージが両方のネットワークカードを介して送信されるとは思いません。

そうでないことを示唆するデータはありますか、それとも簡単に推測していますか?

于 2008-09-08T11:36:43.487 に答える
1

Xp は、IP アドレスの範囲をネットワークとゲートウェイにマップするルーティング テーブルを維持します。

「route print」を使用してテーブルを表示できます。「route add」を使用すると、組み込みデバイスにルートを追加できます。

于 2008-09-08T11:57:21.767 に答える