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);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д