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

Я пытаюсь изучить программирование сокетов UDP на C#. Я создал 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 в текстовое поле. Спасибо за любую помощь.

Всем привет. В документации для класса UdpClient есть пример, который делает именно это: docs.microsoft.com/en-us/dotnet/api/…

JuanR 17.12.2018 20:36
docs.microsoft.com/en-us/dotnet/api/…
Steve 17.12.2018 20:37

JuanR - спасибо. Я не понимаю, как вызвать этот код при получении данных. Думаю, это моя проблема. При использовании TCP при получении данных событие запускается и обрабатывается. Я не понимаю, как вызвать событие, когда данные получены с помощью WinForm.

Sintrigue Sintrigue 17.12.2018 21:02

Стив - спасибо. Как я уже говорил выше, я не вижу, где «слушать» и отвечать на входящие данные, когда код предназначен для приложения Windows Form. Еще раз спасибо.

Sintrigue Sintrigue 17.12.2018 21:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
885
1

Ответы 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);

Другие вопросы по теме