Как реализовать передачу пакета на UDP server?

Реализовать программы клиента и сервера, работающие по протоколу UDP.
Клиент каждые 10 секунд отправляет на сервер пакет данных.

Структура пакета:
номер_пакета -- uint32 (32 бита, беззнаковое целое)
дата_время_отправки -- timestamp (32 бита, целое со знаком)
длина_текста -- uint8 (8 бит, беззнаковое целое)
текст -- произвольное текстовое сообщение длинной до 256 байт

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

Вот сделал клиент с сервером но выводятся ошибки У сервера (System.Net.Sockets.SocketException: "Удаленный хост принудительно разорвал существующее подключение") а у клиента (System.ObjectDisposedException: "Доступ к ликвидированному объекту невозможен.)

client

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            const string ip = "127.0.0.1";
            const int port = 8082;

            var udpEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);

            var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udpSocket.Bind(udpEndPoint);

            UInt32 i = 0;
            DateTime dateTime = DateTime.Now;
            while (true)
            {
                if (DateTime.Now.Subtract(dateTime).TotalSeconds >= 10)
                {

                    var serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081);
                    string message = "Какой то текст";
                    Package package = new Package( message);

                    udpSocket.SendTo(BitConverter.GetBytes(i), serverEndPoint);

                    udpSocket.SendTo(BitConverter.GetBytes(package.Timestamp),  serverEndPoint);

                    udpSocket.SendTo(BitConverter.GetBytes(package.Length),  serverEndPoint);

                    udpSocket.SendTo(Encoding.Default.GetBytes(package.Text),  serverEndPoint);
                    i++;
                    udpSocket.Close();
                
                    dateTime = DateTime.Now;
                }

            }
        }
        class Package
        {
            public int Timestamp { get; private set; }
            public sbyte Length { get; private set; }
            public string Text { get; private set; }
            public Package( string text)
            {
                DateTime dt = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now);
                DateTime dt1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                TimeSpan tsInterval = dt.Subtract(dt1970);
                Timestamp = Convert.ToInt32(tsInterval.TotalSeconds); ;
                Text = text ?? throw new ArgumentNullException(nameof(text));
                if (text.Length > 255) throw new ArgumentOutOfRangeException(nameof(Length));
                Length = (sbyte)text.Length;
            }
        }
    }
}

server

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
            const string ip = "127.0.0.1";
            const int port = 8081;

            var udpEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);

            var udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udpSocket.Bind(udpEndPoint);

            while (true)
            {
                var bufer = new byte[256];
                UInt32 num ;
                UInt32 time;
                int num2;
                string text;
                EndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
                udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
                num = BitConverter.ToUInt32(bufer, 0);
                Console.WriteLine(num);

                udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
                time = BitConverter.ToUInt32(bufer, 0);
                Console.WriteLine(time);

                udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
                num2 = BitConverter.ToUInt16(bufer, 0);
                Console.WriteLine(num2);

                udpSocket.ReceiveFrom(bufer, ref senderEndPoint);
                text = Encoding.Default.GetString(bufer);
                Console.WriteLine(text);

                udpSocket.SendTo(Encoding.UTF8.GetBytes("good"), senderEndPoint);
            }
        }
    }
}


Ответы (0 шт):