C# .Net.Sockets Onreceive частично работает

Я пытаюсь преобразовать исходный код C#, который я использовал в Unity, в приложение Visual Studio Windows Forms, и я не могу понять, почему моя часть onreceive не работает.

Я делаю TCP-соединение с сервером (работает), затем мой сервер отправляет приветственный пакет, который я получаю, но не могу обработать.

Иногда он запускается полностью, но не запускает триггер (объяснено позже).

Поскольку исходный код изначально взят из единого проекта, я могу дождаться обновления, и я думаю, что именно поэтому он там работает.

Код:

private void OnReceive(IAsyncResult ar)
    {
        try
        {
            int byteAmt = myStream.EndRead(ar);
            byte[] myBytes = new byte[byteAmt];
            Buffer.BlockCopy(asyncBuff, 0, myBytes, 0, byteAmt);
            if (byteAmt == 0) return;

            //UnityThread.executeInUpdate(() =>
            //{
            ClientHandleData.HandleData(myBytes);
            //});

            myStream.BeginRead(asyncBuff, 0, 8192, OnReceive, null);
        }
        catch
        {
            Console.WriteLine("we have an error in onreceive");
        }
    }

обработанные данные

public static void HandleData(byte[] data)
    {
        byte[] Buffer;
        Buffer = (byte[])data.Clone();

        if (playerBuffer == null) playerBuffer = new ByteBuffer();
        playerBuffer.WriteBytes(Buffer);

        if (playerBuffer.Count() == 0)
        {
            playerBuffer.Clear();
            return;
        }

        if (playerBuffer.Length() >= 8)
        {
            pLength = playerBuffer.ReadLong(false);
            if (pLength <= 0)
            {
                playerBuffer.Clear();
                return;
            }
        }

        if (playerBuffer.Length() >= 8)
        {
            pLength = playerBuffer.ReadLong(false);
            if (pLength <= 0)
            {
                playerBuffer.Clear();
                return;
            }
        }

        while (pLength > 0 & pLength <= playerBuffer.Length() - 8)
        {
            if (pLength <= playerBuffer.Length() - 8)
            {
                playerBuffer.ReadLong();
                data = playerBuffer.ReadBytes((int)pLength);
                HandleDataPackets(data);
            }
            pLength = 0;

            if (playerBuffer.Length() >= 8)
            {
                pLength = playerBuffer.ReadLong(false);
                if (pLength < 0)
                {
                    playerBuffer.Clear();
                    return;
                }
            }
        }
    }

и, наконец, HandleDataPackets

public static void HandleDataPackets(byte[] data)
    {
        long packetnum; ByteBuffer buffer; Packet_ packet;
        buffer = new ByteBuffer();
        buffer.WriteBytes(data);
        packetnum = buffer.ReadLong();
        buffer = null;

        Form1.label1.Text = "reading packetnum";
        if (packetnum == 0) return;

        Form1.label1.Text = "packetnum read and is not 0";

        if (packets.TryGetValue(packetnum, out packet))
        {
            Form1.label1.Text = "trigger";
            packet.Invoke(data);
        }
    }

иногда доходит до Form1.label1.Text = "packetnum read, а не 0"; строка в HandleDataPacket, но тогда она не запускает строку триггера :(.

Кто-нибудь может сказать мне, почему это так?

Я удалил для вас лишний тег. Из вики-страницы тега visual-studio: используйте этот тег, если у вас есть конкретный вопрос о функциях и возможностях Visual Studio. НЕ используйте этот тег в вопросах, касающихся кода, который случайно был написан в Visual Studio. Подумайте о том, чтобы пометить точную область технологий, на которую ссылается ваш вопрос, а также пометить более конкретную версию Visual Studio. Укажите точную версию VS, выпуск и уровень обновления в своем вопросе.

Llama 09.06.2018 19:35

Если вы не предоставили код, вы никогда ничего не добавляете в пакеты.

Llama 09.06.2018 19:44

это будет сервер, который отправит приветственное сообщение. codepublic static void SendWelcomeMessage (длинный индекс) {ByteBuffer buffer = new ByteBuffer (); buffer.WriteLong ((длинный) ServerPackets.SWelcome); Console.WriteLine ("отправка приветственного пакета."); buffer.WriteString («Добро пожаловать! Пожалуйста, авторизуйтесь и наслаждайтесь игрой.»); SendDataTo (индекс, buffer.ToArray ()); }

Joris de Vos 09.06.2018 21:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
69
1

Ответы 1

Хорошо, я нашел проблему. Я пытался инициализировать пакеты единым способом, но мне пришлось запускать его из самой программы.

Я создал класс Networkmanager, который инициализирует различные пакеты, а затем устанавливает соединение. это исправило!

весь приведенный выше код работает так, как задумано.

Только что понял, что Джон мне это говорил! .. К сожалению, я не видел этого несколько часов назад. Опубликуйте это как ответ и отметьте как единое целое.

Другие вопросы по теме