4

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

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

提前致谢。

4

4 回答 4

2

尝试使用异步方法,这样您就可以继续侦听消息而不会阻止发送消息。

于 2011-07-14T15:28:44.170 回答
1

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

于 2011-07-14T15:25:03.783 回答
0

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

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

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

要尝试的事情:

  1. 确保两端都禁用 IPV6(IPV6 不支持广播地址,但让我们建立一个基线)。
  2. 在程序中显式设置IP地址,是否有效?我的猜测是肯定的,所以我们必须确定原因。
  3. 加载wireshark并嗅探数据包。看看他们是否一直到远程主机,他只是忽略了他们。
于 2011-07-14T15:44:13.583 回答
-1

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

private partial class UdpState
{
    public UdpClient u;
    public IPEndPoint e;
}
于 2011-08-15T16:05:55.573 回答