Чтение пакетов - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Другие игры / Other games

Другие игры / Other games
Прочие онлайн игры и эмуляторы их серверов. Other online games and emulators. При поддержке: SmartGuard - Защита для сервера Lineage 2

Ответ
Опции темы
Непрочитано 14.11.2019, 00:44   #1
Пользователь

Автор темы (Топик Стартер) Чтение пакетов

Пишу эмулятор под игру Soul Worker , но столкнулся с проблемой.
В этой игре клиент сначала отправляет клиентский пакет, затем серверный
Но вот мой сервер почему то пропускает клиентский и сразу читает серверный
К сожалению свою ошибку я не вижу
 
public ClientConnection(Socket socket)
        {
            _socket = socket;
            _socket.NoDelay = true;
 
            BeginReceive();
        }
 
        private void BeginReceive()
        {
            if (_disconnected)
                return;
 
            _socket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, Receive, null);
        }
 
        private void Receive(IAsyncResult ar)
        {
 
            var receivedBytes = 0;
 
            try
            {
                receivedBytes = _socket.EndReceive(ar);
            }
            catch (Exception ex)
            {
                Disconnect($"Receive Exception: {ex}");
            }
 
            // Check if the socket was closed.
            if (receivedBytes == 0)
            {
                Disconnect();
                return;
            }
 
            using (var stream = new MemoryStream(_receiveBuffer, 0, receivedBytes))
            using (var reader = new BinaryReader(stream))
            {
                var keyIdentifier = reader.ReadInt16();
                var size = reader.ReadInt16();
                var sender = reader.ReadByte();
 
                var body = reader.ReadBytes(size);
                body = Cryptography.CryptBytes(2, body);
                using (var messageStream = new MemoryStream(body))
                using (var message = new BinaryReader(messageStream))
                {
                    var opcode = message.ReadInt16R();
                    var handler = MessageTable.FindMessageHandler((ushort)opcode);
                    if (handler != null)
                    {
                        handler.Handle(this, message);
                        log.Debug($"Received(Size:{size}, Opcodes: {opcode}, 0x{opcode:X2})");
                    }
                    else
                    {
                        log.Warn($"Unknown Message Received: Size:{size}, Opcodes: {opcode} (0x{opcode:X2})");
                        log.Warn(BufferExtensions.ToHex(body.Skip(2).ToArray()));
                    }
                }
            }
        }
 
        public void Send(IMessage message)
        {
            var messageData = MessageTable.FindMessageData(message);
 
            if (messageData == null)
                throw new Exception($"Could not find message attribute for {nameof(message)}");
 
 
            using (var bodyStream = new MemoryStream())
            using (var bodyWriter = new BinaryWriter(bodyStream))
            {
                bodyWriter.Write(new byte[] { 0x02, 0x00 });
                bodyWriter.Write((ushort)(bodyStream.Length + 5));
                bodyWriter.Write((byte)1);
                bodyWriter.Write(Cryptography.CryptBytes(2, Make(message, messageData)));
                Send(bodyStream.ToArray());
            }
        }
 
        private byte[] Make(IMessage message, MessageAttribute attribute)
        {
            using (var bodyStream = new MemoryStream())
            using (var bodyWriter = new BinaryWriter(bodyStream))
            {
                bodyWriter.WriteShortR((ushort)attribute.Opcode, true);
                message.Serialize(bodyWriter);
                return bodyStream.ToArray();
            }
        }
 
        private void Send(byte[] buffer)
        {
            try
            {
                _socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, SendCallback, null);
            }
            catch (Exception ex)
            {
                Disconnect($"Send Exception: {ex}");
            }
        }
 
        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                _socket.EndSend(ar);
            }
            catch (Exception ex)
            {
                Disconnect($"Send Exception: {ex}");
            }
        }
 
Code: C#
SelloSoo вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение .dat файла Demon88 Игровой клиент 4 04.09.2019 23:53
Чтение памяти процесса Shayne Программирование / Programming 2 17.05.2017 21:35
Чтение из сокета Zubastic Программирование / Programming 7 04.03.2016 08:19
[Куплю] [php] чтение текста с изображения Mooni Рынок / Marketplace 8 14.03.2014 03:59
Чтение файла UTF8 [STIGMATED] Java 4 23.11.2012 22:04


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 01:20. Часовой пояс GMT +3.

Вверх