在指定的网卡上接收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地址。我如何才能将这些数据包与仅在两个不同网卡上进入的知识分开?
谢谢。
你不是告诉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
}
你有两个端点:
-
listenEndpoint
,通过构造函数传入,指定要听网卡的地址上。 -
clientEndpoint
,作为Ref参数传递给Receive(),这将是populated with the client's IP address,因此您知道谁在跟您说话。
很好解释!这是我没有把握的简单点。感谢您的帮助。 – jsmith 2013-04-11 22:27:31
我遇到同样的问题。我试着按照你在这里建议的方式来做: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("");
}
然后你可以选择在哪个地址开始听。
一下,如果您创建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
猜测如果用两个卡的IP地址替换IPAddress.Any会发生什么情况? – 2013-04-11 21:26:44
@DavidePiras我测试过了,我仍然收到来自两个设备的数据包。有什么我必须指定与改变那里的IP? – jsmith 2013-04-11 21:28:27