Advertisement
RaWRCoder

Recieve UDP packet

Jul 25th, 2014
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.08 KB | None | 0 0
  1.     /// <summary>
  2.         /// Непосредственно считывает пакет, с учётом степени надежности
  3.         /// источника и максимальной допустимой длинны сообщения
  4.         /// </summary>
  5.         /// <param name="p">Выход для пакета</param>
  6.         /// <returns>Удалось ли чтение в штатном режиме?</returns>
  7.         public bool RecievePacket(out Packet p)
  8.         {
  9.             p = new Packet();
  10.             EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
  11.             var buf = new byte[Packet.HeaderLength];
  12.  
  13.             var numBytesRead = MainSocket.ReceiveFrom(buf, 0, Packet.HeaderLength, _sf, ref sender);
  14.  
  15.             //Нам не передали толком даже заголовок?
  16.             if (numBytesRead != Packet.HeaderLength)
  17.                 return false;//Ну нафиг такого (хотя вообще таких надо наверно обрабатывать, может банить кого?)
  18.  
  19.             p.Sender = sender as IPEndPoint;//Запоминаем автора
  20.             p.ProtocolID = BitConverter.ToInt32(buf, 0);//Считываем идентификатор протокола
  21.             p.Command = BitConverter.ToUInt16(buf, 4);//Считываем инструкцию
  22.             p.Length = BitConverter.ToInt32(buf, 6);//Считываем длинну тела сообщения
  23.  
  24.             //Спросим у протокола, можно ли доверять отправителю?
  25.             if (!Protocol.IsEndPointGoodS(this, sender as IPEndPoint, p))
  26.                 return false;//Нет? ну и пох
  27.  
  28.             //Проверим, не пытаются ли убить нас переполнением?
  29.             if (p.Length > Protocol.MaxPacketLength)
  30.             {
  31.                 Log.Post(LogMessageType.Warning,
  32.                     "Got packet with a data sequence of length {0} bytes > {1} bytes max expected from {2}",
  33.                     p.Length, Protocol.MaxPacketLength, p.Sender);
  34.                 Protocol.SafeCallHandlerS(Protocol.FOnMessageTooBigS, this, p);
  35.                 return false;//Лалка, обломайся, я не буду столько данных обрабатывать!
  36.             }
  37.  
  38.             //Считаем тело сообщения.
  39.             buf = new byte[p.Length];
  40.             numBytesRead = MainSocket.ReceiveFrom(buf, 0, p.Length, 0, ref sender);
  41.  
  42.             //Считали какое-то неожиданное число байт? Оо
  43.             if (numBytesRead != p.Length)
  44.             {
  45.                 Log.Post(LogMessageType.Warning,
  46.                     "Obtained data length ({0}) is less than described in header ({1}) from {2}",
  47.                     numBytesRead, p.Length, p.Sender);
  48.                 return false;//НАХУЙ!
  49.             }
  50.  
  51.             //Запишем тело в пакет
  52.             p.Data = buf;
  53.             //И вернем всё наверх
  54.             return true;
  55.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement