3

我有 3 个不同的网卡,每个都有各自的职责。其中两张卡正在接收来自类似设备(直接插入每个单独的网卡)的数据包,该设备在同一端口上发送数据。我需要保存数据包,知道它们来自哪个设备。

鉴于我需要不指定向我发送数据包的设备的 IP 地址,我如何才能在给定的网卡上监听?如果需要,我可以为所有 3 个网卡指定一个静态 IP 地址。

示例:nic1 = 169.254.0.27,nic2 = 169.254.0.28,nic3 = 169.254.0.29

现在我有这个从 nic1 和 nic2 接收数据而不知道它来自哪个设备。

var myClient = new UdpClient(2000) //Port is random example

var endPoint = new IPEndPoint(IPAddress.Any, 0):

while (!finished)
{
    byte[] receivedBytes = myClient.Receive(ref endPoint);
    doStuff(receivedBytes);
}

我似乎无法以某种方式指定网卡的静态 IP 地址,这样我就可以只从其中一个设备中捕获数据包。如何仅在知道它们来自两个不同的网卡的情况下将这些数据包分开?

谢谢你。

4

3 回答 3

8

您没有告诉 UdpClient 监听哪个 IP 端点。即使您要更换IPAddress.Any网卡的端点,您仍然会遇到同样的问题。

如果要告诉 UdpClient 接收特定网卡上的数据包,则必须在构造函数中指定该网卡的 IP 地址。像这样:

var listenEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 2000);
var myClient = new UdpClient(listenEndpoint);

现在,您可能会问“ref endPoint我打电话时有什么作用myClient.Receive(ref endPoint)?” 该端点是客户端的 IP 端点。我建议用以下代码替换您的代码:

IPEndpoint clientEndpoint = null;

while (!finished)
{
    var receivedBytes = myClient.Receive(ref clientEndpoint);
    // clientEndpoint is no longer null - it is now populated
    // with the IP address of the client that just sent you data
}

所以现在你有两个端点:

  1. listenEndpoint,通过构造函数传入,指定要监听的网卡地址。
  2. clientEndpoint, 作为 ref 参数传入 Receive(),它将填充客户端的 IP 地址,以便您知道谁在与您交谈。
于 2013-04-11T22:19:14.403 回答
1

看看这个:

  foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
  {
    Console.WriteLine("Name: " + netInterface.Name);
    Console.WriteLine("Description: " + netInterface.Description);
    Console.WriteLine("Addresses: ");
    IPInterfaceProperties ipProps = netInterface.GetIPProperties();
    foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
    {
      Console.WriteLine(" " + addr.Address.ToString());
    }
    Console.WriteLine("");
  }

然后你可以选择从哪个地址开始监听。

于 2013-04-11T21:25:53.397 回答
0

看,如果您IPEndPoint以以下方式创建您的,它必须工作:

IPHostEntry hostEntry = null;

// Get host related information.
hostEntry = Dns.GetHostEntry(server);

foreach(IPAddress address in hostEntry.AddressList)
{
  IPEndPoint ipe = new IPEndPoint(address, port);
  ...

尝试不0作为端口传递,而是作为有效端口号传递,如果您运行此代码并在第一次迭代后中断 foreach,您将只创建 1IPEndPoint并且您可以在调用中使用该端口:myClient.Receive

请注意,UdpClient该类有一个名为 Client 的成员,它是一个套接字,尝试探索该对象的属性以找出一些详细信息,我在这里找到了我给你的代码:http: //msdn.microsoft.com/ en-us/图书馆/system.net.sockets.socket.aspx

于 2013-04-11T21:37:31.033 回答