UDP чат. При отправке сообщения, размер которого больше принимаемого буфера, сервер падает - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Учу c# устал от книжек и решил написать простенький чат используя udp сокеты. Получилось так что столкнулся с дурацкой проблемой . Если я отправляю сообщение больше чем мой принимающий буфер , на сервере у меня падает Receive()
..некйи код
       IPEndPoint ipendpointrecc = new IPEndPoint(IPAddress.Any, 15000);
       udprec.Bind(ipendpointrecc);
..некйи код 
       void Receive()
        {
            try
            {
                while (true)
                {

                    byte[] message = new byte[1024];
                    udprec.Receive(message);
                    string msg = Encoding.Default.GetString(message);

                    // Если дана команда остановить поток, останавливаем бесконечный цикл.
                    if (stopReceive == true) break;
 
                    if (msg == "OK")
                    { MessageBox.Show(msg); }
                    else { }
 
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
С ошибкой: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself. Всё бы ничего ,т.к. я могу тупо ее перезапустить ,в свое время, ограничив сообщение на клиенте. Но вот нюанс - если злоумышленник узнает порт и будет постоянно слать мне на сервер сообщения больше буфера,то остальные нормальные пользователи просто не смогут работать. После чего я начал рыть в интернете ... рыл рыл и ни черта не нарыл .... Мне необходимо просто отрезать лишнее и принять все что влезет в буфер.

Решение задачи: «UDP чат. При отправке сообщения, размер которого больше принимаемого буфера, сервер падает»

textual
Листинг программы
Thread rec = null;
 
        private void buttonReceive_Click(object sender, EventArgs e)
        {
            // Запускаем отдельный поток для асинхронной работы приложения
            // во время приема сообщений
           
           
            stopReceive = false;
            rec = new Thread(new ThreadStart(Receive));
            rec.Start();
        }
 
void Receive()
        {
            try
            {
                while (true)
                {
 
                    
                    byte[] message = new byte[3];
                    udprec.DontFragment = false;
                    udprec.ReceiveBufferSize = 3;
                    Int32 bytes = udprec.Receive(message, 3, 0);
                
                    string msg = Encoding.Default.GetString(message);
                    ShowMessage(Encoding.Default.GetString(message));
 
                    // Если дана команда остановить поток, останавливаем бесконечный цикл.
                    if (stopReceive == true) break;
                    if (msg == "OK")
                    { MessageBox.Show(msg); }
                    else { }
 
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы