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

258
03 мая 2022, 21:10

Реализовать программы клиента и сервера, работающие по протоколу 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);
            }
        }
    }
}
READ ALSO
Парсинг атрибута transform SVG с помощью javascript

Парсинг атрибута transform SVG с помощью javascript

Предположим, у нас есть строка преобразования SVG:

328
Скролл до нужного места

Скролл до нужного места

Такой вот вопросда, не стандартный, но интересно, на что способен JS

242
Как вывести строки содержащие слово?

Как вывести строки содержащие слово?

Как вывести строки которые содержат слово "error"?

314
Проблема с Date на Node JS

Проблема с Date на Node JS

При создании экземпляра Date (new Date()), судя по документации, возвращается текущее локальное время, но мне возвращается время со сдвигом на -2 часа

299