C# Получение данных UDP

Я пытаюсь изучить программирование сокетов UDP на С#. Я сделал WinForm, который будет отправлять данные, код указан ниже. Это небольшая форма с тремя текстовыми полями и кнопкой.

using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace UDP_example

{
    public partial class Form1 : Form1
    {
    public Form1()
    {
        InitializeComponent();
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        // make sure all text boxes contain data, or do nothing.
        if (string.IsNullOrEmpty(txtIP.Text)) return;
        if (string.IsNullOrEmpty(txtPort.Text)) return;
        if (string.IsNullOrEmpty(txtMessage.Text)) return;

        // convert the text into byte array
        byte[] message = Encoding.ASCII.GetBytes(txtMessage.Text);
        string ipAddress = txtIP.Text;
        int sendPort = Convert.ToInt32(txtPort.Text);

        // send the data
        try
        {
            using (var client = new UdpClient())
            {
                IPEndPoint server = new IPEndPoint(IPAddress.Parse(ipAddress), sendPort);
                client.Connect(server);
                client.Send(message, message.Length);
            }
        }
        // display error if one occurs
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }

        // clean up
        txtMessage.Clear();
        txtMessage.Focus();
    }
}

Эта часть работает нормально. Мне нужно отображать полученные данные в текстовом поле или окне сообщений на другой стороне соединения.

Может ли кто-нибудь показать мне, как это сделать? Я не знаю, как заставить сокет прослушивать асинхронно и отображать входящие данные на принимающей стороне. Это будет просто форма с текстовым полем или одним окном сообщений, в котором отображаются входящие данные.

РЕДАКТИРОВАТЬ: это код получения, но я хочу, чтобы он получал с любого IP-адреса, а не только с локального. (Найден и изменен этот фрагмент кода.)

using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace UDP_Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ConnectUDP));
        }

        private void ConnectUDP(object state)
        {
            UdpClient subscriber = new UdpClient(4345);
            IPAddress addr = IPAddress.Parse("127.0.0.1");
            subscriber.JoinMulticastGroup(addr);
            IPEndPoint ep = null;

            byte[] pdata = subscriber.Receive(ref ep);
            string rdata = Encoding.ASCII.GetString(pdata);
            txtReceived.Text += rdata;
        }
    }
}

Сегодня я прочитал много примеров и посмотрел несколько видео на YouTube, но я довольно застрял на том, что, как мне казалось, будет очень простым. Мое единственное требование состоит в том, что он помещает полученные данные из порта UDP в текстовое поле. Спасибо за любую помощь.


person Sintrigue Sintrigue    schedule 17.12.2018    source источник
comment
Всем привет. В документации для класса UdpClient есть пример, который делает именно это: docs.microsoft.com/en-us/dotnet/api/   -  person JuanR    schedule 17.12.2018
comment
docs.microsoft.com/en-us/dotnet/api/   -  person Steve    schedule 17.12.2018
comment
ХуанР - спасибо. Я не понимаю, как вызвать этот код при получении данных. Думаю, это моя проблема. При использовании TCP при получении данных событие запускается и обрабатывается. Я не вижу, как вызвать событие при получении данных с помощью WinForm.   -  person Sintrigue Sintrigue    schedule 17.12.2018
comment
Стив - спасибо. Как я уже говорил выше, я не вижу, где слушать и реагировать на входящие данные, когда код предназначен для приложения формы Windows. Спасибо еще раз.   -  person Sintrigue Sintrigue    schedule 17.12.2018


Ответы (1)


Как упоминалось в @JuanR, вам понадобится что-то подобное на стороне вашего сервера.

// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient(yourUDPPort);

//IPEndPoint object will allow us to read datagrams sent from any source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 
string returnData = Encoding.ASCII.GetString(receiveBytes);
person ChrizzleWhizzle    schedule 17.12.2018