Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Структура PROTOCOL_LOGIN_ACK
#11
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]
Ответ
#12
тип int received чему равно?
Ответ
#13
Boris2105 Написал:тип int received чему равно?

Раньше было = 2 байтам теперь всё норм.
Новый вопрос пакет 528 два раза так и должен приходить?
Код:
[Info] Received = 6

[Info] Received = 7

[Info] PacketId = 528

[Info] PacketId = 528

|--------------------------------------------------------------------------|

| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |

|--------------------------------------------------------------------------|

| 0000: 00 A0 10 02 ....

|--------------------------------------------------------------------------|

|--------------------------------------------------------------------------|

| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |

|--------------------------------------------------------------------------|

| 0000: 00 A0 10 02 ....

|--------------------------------------------------------------------------|
Ответ
#14
Нет, один раз. Это настройки клиента.
Ответ
#15
PROGRAMMATOR Написал:Нет, один раз. Это настройки клиента.

В чём может быть проблема?Вроде всё верно,но пакет почему то приходит 2 раза:
[SRC="csharp"]
void BeginRead(IAsyncResult asyncResult)
{
int received = stream.EndRead(asyncResult);
log.Info("Received = {0}", received);
while (received >= 6)
{
int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;

byte[] temp = new byte[length + 2];
Buffer.BlockCopy(buffer, 0, 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]
Ответ
#16
Dom2;405581 Написал:Buffer.BlockCopy(buffer, 0,

В моём примере не так. Smile
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Структура, крипт и декрипт Tcp и Udp пакетов PROGRAMMATOR 22 16,493 11-28-2018, 03:59 AM
Последний пост: AngryKitten
  PROTOCOL_LOGIN_ACK Boris2105 81 12,627 06-03-2016, 07:39 PM
Последний пост: PROGRAMMATOR
  Структура PROTOCOL_BASE_GET_SCHANNELLIST_ACK BallDev 3 1,656 05-21-2016, 06:25 PM
Последний пост: PROGRAMMATOR
  Структура PROTOCOL_INVENTORY_USE_ITEM_ACK BallDev 0 963 05-06-2016, 12:36 PM
Последний пост: BallDev
  Структура PROTOCOL_BASE_GET_MYINFO_ACK BallDev 6 2,027 05-03-2016, 04:48 AM
Последний пост: crayonnet
  Структура PROTOCOL_ROOM_GET_SLOTINFO_ACK Empert 1 1,564 04-01-2016, 09:25 AM
Последний пост: PROGRAMMATOR
  [Piercing Blow] Структура PROTOCOL_BASE_GET_SYSTEM_INFO_ACK BallDev 2 2,077 03-28-2016, 08:32 PM
Последний пост: BallDev

Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)