在指定网卡上接收udp报文c#

jsm*_*ith 3 c# nic udp udpclient

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

鉴于我不需要指定发送数据包的设备的IP地址,我该如何监听给定的网卡?如果需要,我可以为所有3个nics指定静态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);
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法以允许我从其中一个设备捕获数据包的方式指定网卡的静态IP地址.如何才能将这些数据包与他们在两个不同网卡上传入的知识分开?

谢谢.

Phi*_*hil 6

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

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

var listenEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 2000);
var myClient = new UdpClient(listenEndpoint);
Run Code Online (Sandbox Code Playgroud)

现在,你可能会问:" 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
}
Run Code Online (Sandbox Code Playgroud)

所以现在你有两个端点:

  1. listenEndpoint,通过构造函数传入,指定要监听的网卡的地址.
  2. clientEndpoint,作为ref参数传递给Receive(),它将填充客户端的IP地址,以便您知道谁在与您通话.