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

时间:2011-07-14 15:20:47

标签: c# .net udp lan

我正在尝试在LAN上测试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);

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

提前致谢。

4 个答案:

答案 0 :(得分:2)

尝试使用异步方法,以便您可以继续监听邮件而不会阻止发送邮件。

答案 1 :(得分:1)

好吧,如果相同的代码在一个而不是另一个上工作,那就是你的环境。检查防火墙设置,确保它不会阻止发送方广播或阻止接收方接收。 Wireshark(甚至是Windows的netmon)在这里应该会有所帮助。

答案 2 :(得分:0)

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

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

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

要尝试的事情:

  1. 确保两端都禁用IPV6(IPV6不支持广播地址,但只允许建立基线)。
  2. 在程序中明确设置IP地址,是否有效?我的猜测是肯定的,所以我们必须确定原因。
  3. 加载wireshark并嗅探数据包。看看他们是否一直到远程主机,他只是忽略了它们。

答案 3 :(得分:-1)

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

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