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);
}
}