我有 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 地址,这将允许我仅从其中一个设备捕获数据包。我怎样才能在知道它们来自两个不同网卡的情况下分离这些数据包?

谢谢你。

最佳答案

您没有告诉 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
}

所以现在你有两个端点:
  • listenEndpoint ,通过构造函数传入,指定要监听的网卡地址。
  • clientEndpoint ,作为 ref 参数传递给 Receive(),它将是 populated with the client's IP address 以便您知道谁在与您交谈。
  • 关于c# - 在指定网卡上接收udp包c#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15958930/

    10-16 01:17