向所有可用网卡广播 UDP 消息
我需要向特定的 IP 和端口发送 UDP 消息。
由于有 3 个网卡,
10.1.x.x
10.2.x.x
10.4.x.x
当我发送 UDP 消息时,我仅在一个网络适配器中接收该消息...其余 ip 未接收。
我想在发送消息时检查网络适配器。 我怎样才能做到这一点?
目前我正在使用以下内容:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(LocalIP), 0);
IPEndPoint targetEndPoint = new IPEndPoint(TargetIP, iTargetPort);
UdpClient sendUdpClient = new UdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
I need to send a UDP message to specific IP and Port.
Since there are 3 network cards,
10.1.x.x
10.2.x.x
10.4.x.x
when i send a UDP message,i am receiving the message only in one network adapter...the rest of the ip's are not receiving.
I want to check for the network adapter while sending the message. How can I do that?
Currently I am using the following:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(LocalIP), 0);
IPEndPoint targetEndPoint = new IPEndPoint(TargetIP, iTargetPort);
UdpClient sendUdpClient = new UdpClient(localEndPoint);
int numBytesSent = sendUdpClient.Send(CombineHeaderBody, CombineHeaderBody.Length, targetEndPoint);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这实际上比听起来更棘手,因为如果您有多个接口,广播并不总是会发送到所有接口。 为了解决这个问题,我创建了这个类。
然后,为了通过广播发送 UDP 数据包,我使用如下所示的内容。 我正在使用
IPAddress.Broadcast
和MyUdpClient
,这与您的代码不同。另外,您应该注意,当您使用特定的
ipaddress
而不是广播时,路由表只会将其发送到与该地址匹配的接口。因此,在您的示例中,使用单播。 您需要将
LocalIP
设置为要发送到的本地接口的 IP。 如果有三个接口,您将拥有三个本地 IP,并且您需要选择正确的一个来使用。由于路由已关闭,您可能会在所有接口上看到它,但您需要针对单播情况进行测试。
如果您不关心发送 IP 或端口,可以使用以下代码。
或者对于广播
IPAddress.Broadcast
的问题是它们不会通过任何网关进行路由。 为了解决这个问题,您可以创建一个IPAddresses
列表,然后循环并发送。 此外,由于发送可能会因您无法控制的网络问题而失败,因此您还应该有一个 try/catch 块。编辑:请参阅上面对具有多个接口的单播的更改以及 尝试将数据包单播到可用网络时出现问题。
This is actually trickier than it sounds because if you have more than one interface the broadcasts will not always go out to all the interfaces. To get around this I created this class.
Then to send the UDP packet via broadcast, I use something like the following. I am using
IPAddress.Broadcast
andMyUdpClient
, which is different from your code.Also, you should note that when you use a specific
ipaddress
instead of broadcast the route table only sends it out the interface that matches the address.So in your example, unicast is used. You need to set
LocalIP
to the IP of the local interface you want to send out to. With three interfaces, you would have three local IP's and you need to pick the correct one to use.Because route is turned off you might see it on all interfaces but you will need to test this for the unicast case.
If you don't care about the send IP or port you can use the following code.
or for broadcast
The problem with
IPAddress.Broadcast
is that they will not route through any gateways. To get around this you can create a list ofIPAddresses
and then loop through and send. Also since Send can fail for network issues that you cannot control you should also have a try/catch block.Edit: see above change to unicast with multiple interfaces and also Problem Trying to unicast packets to available networks.
雷克斯答案的扩展。 这使您不必对要广播的 IP 地址进行硬编码。 循环遍历所有接口,检查它们是否已启动,确保其具有 IPv4 信息以及与其关联的 IPv4 地址。 只需将“数据”变量更改为您想要广播的任何数据,并将“目标”端口更改为您想要的端口即可。 小缺点是,如果一个接口有多个与其关联的 IP 地址,它将从每个地址进行广播。 注意:这还将尝试通过任何 VPN 适配器发送广播(通过网络和共享中心/网络连接,Win 7+ 验证),如果您想接收响应,则必须保存所有客户端。 您也不需要中学课程。
Expansion of Rex's Answer. This allows you to not have to hard code the ip addresses that you want to broadcast on. Loops through all interfaces, checks if they are up, makes sure it has IPv4 information, and an IPv4 address is associated with it. Just change the "data" variable to whatever data you want to broadcast, and the "target" port to the one you want. Small drawback is that if an interface has multiple ip addresses associated with it, it will broadcast out of each address. Note: this will ALSO try to send broadcasts through any VPN adapter (via Network and Sharing Center/Network Connections, Win 7+ verified), and if you want to receive responses, you will have to save all the clients. You also will not need a secondary class.
我通过从每个适配器发送 UDP 广播(使用绑定)解决了这个问题:
I solved this problem by sending the UDP broadcast from each adapter (using bind):
如果您发送到特定的 IP 地址,那么您是单播,而不是广播。
If you are sending to a specific IP address then you are unicasting, not broadcasting.