01-19-2016, 11:43 PM
PROGRAMMATOR Написал:А это уже проблема в чтении. Как и раньше, может прилететь несколько пакетов в одном, и например, если там было 2 пакета подряд, вы их декрипнули как один, тогда у второго уже данные будут неверными.Сделал так вообще перестало читать пакеты от клиента
[SRC="csharp"]while (received >= 6)
{
int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
byte[] temp = new byte[length + 2];
Buffer.BlockCopy(buffer, 2, temp, 0, temp.Length);
BitwiseHelper.Unshift(temp, bits);
packetQueue.Enqueue(new ReceivePacketFrame(this, temp));
received -= length + 4;
Buffer.BlockCopy(buffer, length + 4, buffer, 0, received); // << Копируем оставшиеся данные в начало буфера
}
[/SRC]
[SRC="csharp"]
void BeginRead(IAsyncResult asyncResult)
{
int received = stream.EndRead(asyncResult);
while (received >= 6)
{
int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
byte[] temp = new byte[length + 2];
Buffer.BlockCopy(buffer, 2, temp, 0, temp.Length);
int _bits = _sessionId % 7 + 1;
BitShift.Unshift(temp, _bits);
byte[] opcode = new byte[] { temp[2], temp[3] };
RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
Type t = Type.GetType("PiercingBlow.Auth.Network.Recv." + packet.ToString());
log.Info("PacketId = {0} Lenght = {1}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
if (t != null)
{
ClientPacket clientpacket = (ClientPacket)Activator.CreateInstance(t);
clientpacket.client = this;
clientpacket.Process(buffer);
}
else
{
log.Trace(temp.ToHex());
}
received -= length + 4;
Buffer.BlockCopy(buffer, length + 4, buffer, 0, received); // << Копируем оставшиеся данные в начало буфера
}
stream.BeginRead(buffer, 0, buffer.Length, BeginRead, null);
}
[/SRC]