【问题标题】:C# Broadcast is UDP message, listen for multiple repliesC#广播是UDP消息,监听多个回复
【发布时间】:2017-03-29 20:39:44
【问题描述】:

我正在尝试编写一些执行 UDP 广播的代码,然后监听来自远程服务器的回复说它们存在。它用于识别在子网上运行服务器应用程序的机器,因此基本上会发出“谁在那里?”并听取所有回复。

我在 Java 中有这个(完美运行),它将一个 DatagramPacket 广播发送到 224.168.101.200 的组地址。然后有一个工作线程继续侦听来自同一个套接字的传入 DatagramPackets。

Thisthis 不是答案,因为他们说如何在不同的机器上进行发送和侦听。

【问题讨论】:

  • 不同机器和同一机器有什么区别?
  • @JeroenvanLangen - 首先,我是使用相同的 UdpClient 还是不同的 UdpClient?其次,如果我在特定 IP 地址上发送广播,我需要做些什么特别的事情?
  • 我不是 100% 确定,但是有两个 udpclient 就可以了。广播数据报时,两者都需要加入同一个多播组。
  • @JeroenvanLangen 我尝试了相同的 UdpClient 和不同的 UdpClient - 不起作用。

标签: c# udp broadcast udpclient


【解决方案1】:

刚刚为您做了一个工作示例,您可以比较哪里出了问题。我创建了一个带有 2 个文本框和一个按钮的 Windows 窗体应用程序。

public partial class Form1 : Form
{
    private int _port = 28000;

    private string _multicastGroupAddress = "239.1.1.1";

    private UdpClient _sender;
    private UdpClient _receiver;

    private Thread _receiveThread;

    private void UpdateMessages(IPEndPoint sender, string message)
    {
        textBox1.Text += $"{sender} | {message}\r\n";
    }

    public Form1()
    {
        InitializeComponent();

        _receiver = new UdpClient();
        _receiver.JoinMulticastGroup(IPAddress.Parse(_multicastGroupAddress));
        _receiver.Client.Bind(new IPEndPoint(IPAddress.Any, _port));

        _receiveThread = new Thread(() =>
        {
            while (true)
            {
                IPEndPoint sentBy = new IPEndPoint(IPAddress.Any, _port);
                var dataGram = _receiver.Receive(ref sentBy);

                textBox1.BeginInvoke(
                    new Action<IPEndPoint, string>(UpdateMessages), 
                    sentBy, 
                    Encoding.UTF8.GetString(dataGram));
            }
        });
        _receiveThread.IsBackground = true;
        _receiveThread.Start();


        _sender = new UdpClient();
        _sender.JoinMulticastGroup(IPAddress.Parse(_multicastGroupAddress));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var data = Encoding.UTF8.GetBytes(textBox2.Text);
        _sender.Send(data, data.Length, new IPEndPoint(IPAddress.Broadcast, _port));
    }
}

【讨论】:

  • 谢谢 - 我有 2 个呼叫出现故障,一个呼叫使用特定的 IP 地址。一旦我改变了它,它就起作用了。
  • 它没有,(从我现有的代码复制)多播组在使用多个发件人时很有用。并且您想将发件人/收件人“拆分”为组。在这种情况下,它已经在我的代码中@Alophind
猜你喜欢
  • 2014-12-04
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多