在.net中发送和接收UDP数据包

本文关键字:UDP 数据包 net | 更新日期: 2023-09-27 18:02:10

我正在尝试在局域网上测试UDP通信。我有一小段代码,我试图在2台计算机上运行它(一台应该等待接收,另一台应该发送)。奇怪的是,计算机A发送和B接收正常,但如果我尝试A接收和B发送它不工作。你知道为什么吗?

public void SendBroadcast(int port, string message)
    {
        UdpClient client = new UdpClient();
        byte[] packet = Encoding.ASCII.GetBytes(message);
        try
        {
            client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
public void Receive(int port)
    {
        UdpClient client = null;
        try
        {
            client = new UdpClient(port);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);

        while (true) 
        {
            try
            {
                byte[] packet = client.Receive(ref server);
                Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

和呼叫:

  SendBroadcast(444, "hello"); Receive(444);

如果我在同一台计算机上运行该程序的两个实例,它可以正常工作,但每次调用创建3个包。

在.net中发送和接收UDP数据包

尝试使用异步方法,以便您可以继续侦听消息而不会阻塞发送消息

如果相同的代码在其中一个上运行而在另一个上不起作用,那就是您的环境。检查你的防火墙设置,确保它不会阻止发送者的广播或阻止接收者的接收。

在这两个系统之间是什么网络设备?

两个系统是否在同一子网,具有相同的子网掩码?

IPV4网络有一个有趣的事情;您可以有多个广播地址。可以广播到本地网络,也可以广播到本地子网。这些是明显不同的地址,如果一个系统的IP设置是不同的,它可能没有意识到它应该监听这个本地子网广播。

尝试:

  1. 确保IPV6在两端禁用(IPV6不支持广播地址,但让我们只是建立一个基线)。
  2. 在程序中明确设置IP地址,是否有效?我猜是肯定的,所以我们必须确定原因。
  3. 加载wireshark并嗅探报文。查看它们是否一路到达远程主机,而远程主机只是忽略它们。

当尝试异步执行此操作时,Microsoft忽略了告诉用户像这样创建自己的部分类(见下文)。非常简单,但是如果没有这个,就很难通读他们的例子。

private partial class UdpState
{
    public UdpClient u;
    public IPEndPoint e;
}