UDP чат. При отправке сообщения, размер которого больше принимаемого буфера, сервер падает - C#
Формулировка задачи:
Всем привет. Учу c# устал от книжек и решил написать простенький чат используя udp сокеты. Получилось так что столкнулся с дурацкой проблемой . Если я отправляю сообщение больше чем мой принимающий буфер , на сервере у меня падает Receive()
С ошибкой:
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.
Всё бы ничего ,т.к. я могу тупо ее перезапустить ,в свое время, ограничив сообщение на клиенте. Но вот нюанс - если злоумышленник узнает порт и будет постоянно слать мне на сервер сообщения больше буфера,то остальные нормальные пользователи просто не смогут работать. После чего я начал рыть в интернете ... рыл рыл и ни черта не нарыл .... Мне необходимо просто отрезать лишнее и принять все что влезет в буфер.
..некйи код 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); } }
Решение задачи: «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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д