Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// Непосредственно считывает пакет, с учётом степени надежности
- /// источника и максимальной допустимой длинны сообщения
- /// </summary>
- /// <param name="p">Выход для пакета</param>
- /// <returns>Удалось ли чтение в штатном режиме?</returns>
- public bool RecievePacket(out Packet p)
- {
- p = new Packet();
- EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- var buf = new byte[Packet.HeaderLength];
- var numBytesRead = MainSocket.ReceiveFrom(buf, 0, Packet.HeaderLength, _sf, ref sender);
- //Нам не передали толком даже заголовок?
- if (numBytesRead != Packet.HeaderLength)
- return false;//Ну нафиг такого (хотя вообще таких надо наверно обрабатывать, может банить кого?)
- p.Sender = sender as IPEndPoint;//Запоминаем автора
- p.ProtocolID = BitConverter.ToInt32(buf, 0);//Считываем идентификатор протокола
- p.Command = BitConverter.ToUInt16(buf, 4);//Считываем инструкцию
- p.Length = BitConverter.ToInt32(buf, 6);//Считываем длинну тела сообщения
- //Спросим у протокола, можно ли доверять отправителю?
- if (!Protocol.IsEndPointGoodS(this, sender as IPEndPoint, p))
- return false;//Нет? ну и пох
- //Проверим, не пытаются ли убить нас переполнением?
- if (p.Length > Protocol.MaxPacketLength)
- {
- Log.Post(LogMessageType.Warning,
- "Got packet with a data sequence of length {0} bytes > {1} bytes max expected from {2}",
- p.Length, Protocol.MaxPacketLength, p.Sender);
- Protocol.SafeCallHandlerS(Protocol.FOnMessageTooBigS, this, p);
- return false;//Лалка, обломайся, я не буду столько данных обрабатывать!
- }
- //Считаем тело сообщения.
- buf = new byte[p.Length];
- numBytesRead = MainSocket.ReceiveFrom(buf, 0, p.Length, 0, ref sender);
- //Считали какое-то неожиданное число байт? Оо
- if (numBytesRead != p.Length)
- {
- Log.Post(LogMessageType.Warning,
- "Obtained data length ({0}) is less than described in header ({1}) from {2}",
- numBytesRead, p.Length, p.Sender);
- return false;//НАХУЙ!
- }
- //Запишем тело в пакет
- p.Data = buf;
- //И вернем всё наверх
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement