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

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

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

Всем привет. Учу c# устал от книжек и решил написать простенький чат используя udp сокеты. Получилось так что столкнулся с дурацкой проблемой . Если я отправляю сообщение больше чем мой принимающий буфер , на сервере у меня падает Receive()
Листинг программы
  1. ..некйи код
  2. IPEndPoint ipendpointrecc = new IPEndPoint(IPAddress.Any, 15000);
  3. udprec.Bind(ipendpointrecc);
  4. ..некйи код
  5. void Receive()
  6. {
  7. try
  8. {
  9. while (true)
  10. {
  11.  
  12. byte[] message = new byte[1024];
  13. udprec.Receive(message);
  14. string msg = Encoding.Default.GetString(message);
  15.  
  16. // Если дана команда остановить поток, останавливаем бесконечный цикл.
  17. if (stopReceive == true) break;
  18. if (msg == "OK")
  19. { MessageBox.Show(msg); }
  20. else { }
  21. }
  22. }
  23. catch (Exception e)
  24. {
  25. MessageBox.Show(e.Message);
  26. }
  27. }
С ошибкой: 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
Листинг программы
  1. Thread rec = null;
  2.  
  3.         private void buttonReceive_Click(object sender, EventArgs e)
  4.         {
  5.             // Запускаем отдельный поток для асинхронной работы приложения
  6.             // во время приема сообщений
  7.            
  8.            
  9.             stopReceive = false;
  10.             rec = new Thread(new ThreadStart(Receive));
  11.             rec.Start();
  12.         }
  13.  
  14. void Receive()
  15.         {
  16.             try
  17.             {
  18.                 while (true)
  19.                 {
  20.  
  21.                    
  22.                     byte[] message = new byte[3];
  23.                     udprec.DontFragment = false;
  24.                     udprec.ReceiveBufferSize = 3;
  25.                     Int32 bytes = udprec.Receive(message, 3, 0);
  26.                
  27.                     string msg = Encoding.Default.GetString(message);
  28.                     ShowMessage(Encoding.Default.GetString(message));
  29.  
  30.                     // Если дана команда остановить поток, останавливаем бесконечный цикл.
  31.                     if (stopReceive == true) break;
  32.                     if (msg == "OK")
  33.                     { MessageBox.Show(msg); }
  34.                     else { }
  35.  
  36.                 }
  37.             }
  38.             catch (Exception e)
  39.             {
  40.                 MessageBox.Show(e.Message);
  41.             }
  42.         }

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


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

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

7   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы