在指定的网卡上接收udp数据包c#

问题描述:

我有3个不同的网卡,每个网卡都有自己的责任。其中两块卡正在接收来自类似设备的数据包(直接插入每个单独的网卡),该数据包在同一端口上发送数据。我需要保存这些数据包,以了解它们来自哪个设备。在指定的网卡上接收udp数据包c#

考虑到我需要的不指定给我的报文设备的IP地址,我怎么可以听一个给定的上网卡?如果需要,我可以为所有3个nics指定一个静态ip地址。

示例:NIC1 = 169.254.0.27,网卡= 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地址。我如何才能将这些数据包与仅在两个不同网卡上进入的知识分开?

谢谢。

+0

猜测如果用两个卡的IP地址替换IPAddress.Any会发生什么情况? – 2013-04-11 21:26:44

+0

@DavidePiras我测试过了,我仍然收到来自两个设备的数据包。有什么我必须指定与改变那里的IP? – jsmith 2013-04-11 21:28:27

你不是告诉UdpClient听什么IP端点。即使您要将IPAddress.Any替换为网卡的端点,您仍然会遇到同样的问题。

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

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

现在,你可能会问“什么时候我打电话myClient.Receive(ref endPoint)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(),这将是populated with the client's IP address,因此您知道谁在跟您说话。
+0

很好解释!这是我没有把握的简单点。感谢您的帮助。 – jsmith 2013-04-11 22:27:31

+0

我遇到同样的问题。我试着按照你在这里建议的方式来做:UdpClient listener = new UdpClient(new IPEndPoint(IPAddress.Parse(“10.1.1.1”),listenPort)); 但是,它正在侦听不正确的网卡。 – 2015-09-26 20:03:51

检查了这一点这样的:

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(""); 
    } 

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

+0

这只会给我我已经知道的静态ips。我知道如何访问这些卡片。我不知道如何创建一个只监听其中一个卡的udp客户端。 :) – jsmith 2013-04-11 21:29:23

+0

所以绑定到选定的IP和端口不工作,我认为你可以从这个列表programmatcaly得到IP,并用于创建端点,而不是任何地址。 – Mateusz 2013-04-11 21:50:13

+0

它似乎并没有工作,我目前正在做它。我想我缺少一些小... – jsmith 2013-04-11 22:18:39

一下,如果您创建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第一次迭代中,你将有只有1 IPEndPoint创建,您可以使用您的调用一个:myClient.Receive

公告称,UdpClient类有一个成员calledd客户端是一个插座,尝试探索对象的属性以及找出一些细节,我哈哈已经找到了我给你这里的代码:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx