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

4

我正在尝试在局域网上测试UDP通信。我有一小段代码,并尝试在两台计算机上运行它(一台应该等待接收,另一台应该发送)。奇怪的是,计算机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个包。提前感谢。

明确指定IP地址而不依赖广播是否可以使其在双向上工作? - Tremmors
4个回答

2

尝试使用异步方法,这样您就可以在不阻塞发送消息的情况下继续监听消息。


你能详细说明一下异步方法吗?有任何相关链接吗?谢谢。 - WEFX
这里是MSDN文档的链接:http://msdn.microsoft.com/en-us/library/9wkb9k12.aspx。查找以“Begin”和“End”开头的方法。这里有很多例子可以找到。 - Jay

1
如果同样的代码在一个环境下可以工作而在另一个环境下不行,那就是因为你的运行环境有问题。检查一下你的防火墙设置,确保它没有阻止发送端的广播或者接收端的接收。Wireshark(甚至Windows的网络监视器)应该会对此有帮助。

0

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

这两个系统是否在同一个子网上,使用相同的子网掩码?

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

尝试以下几点:

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

-1

当尝试异步执行此操作时,微软忽略了告诉用户创建自己的部分类似于下面这样(见下文)。非常简单,但如果没有这个,阅读他们的示例可能会很困难。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接