c # SslStream.Read Loop проблема - PullRequest
0 голосов
/ 02 июня 2011

Я изучал C #, создав приложение, и столкнулся с трудностями, с которыми я действительно борюсь.

В основном у меня есть код ниже, который я использую для чтения из сетевого потока, который я настроил. Это работает, но только как чтение 1 пакета каждый раз, когда sslstream.Read () разблокируется. Это вызывает большое отставание сообщений.

Что я пытаюсь сделать, так это то, что часть прочитанного потока содержит несколько пакетов, прочитавших их все.

Я пытался разобраться несколько раз, но я просто оказался в большом беспорядке кода.

Если бы кто-нибудь мог помочь, я был бы благодарен!

(первые 4 байта каждого пакета - это размер пакета. Диапазон пакетов составляет от 8 до 28 000 байтов)

        SslStream _sslStream = (SslStream)_sslconnection;
        int bytes = -1;
        int nextread = 0;
        int byteslefttoread = -1;
        byte[] tmpMessage;
        byte[] buffer = new byte[3000000];
        do
        {
            bytes = _sslStream.Read(buffer, nextread, 8192);
           int packetSize = BitConverter.ToInt32(buffer, 0);
            nextread += bytes;
            byteslefttoread = packetSize - nextread;

            if (byteslefttoread <= 0)
            {
                int leftover = Math.Abs(byteslefttoread);
                do
                {
                    tmpMessage = new byte[packetSize];
                    Buffer.BlockCopy(buffer, 0, tmpMessage, 0, packetSize);

                    PacketHolder tmpPacketHolder = new PacketHolder(tmpMessage, "in");
                    lock (StaticMessageBuffers.MsglockerIn)
                    {
                        //puts message into the message queue.. not very oop... :S
                        MessageInQueue.Enqueue(tmpPacketHolder);
                    }
                }
                while (leftover > 0);

                Buffer.BlockCopy(buffer, packetSize , buffer, 0, leftover);
                byteslefttoread = 0;
                nextread = leftover;

            }

        } while (bytes != 0);

1 Ответ

0 голосов
/ 02 июня 2011

Если вы используете .Net 3.5 или более позднюю версию, я настоятельно рекомендую вам ознакомиться с Windows Communication Foundation (wcf) . Это просто все, что вы пытаетесь сделать по сети.

С другой стороны, если вы делаете это исключительно в образовательных целях. Взгляните на эту ссылку . Лучше всего читать из потока с несколько меньшими приращениями и передавать эти данные в другой поток. Как только вы можете определить длину данных, которая вам нужна для сообщения, вы можете отрезать второй поток в сообщении. Вы можете настроить внешний цикл, где проверяются доступные байты, и подождать, пока его значение не станет> 0, чтобы начать следующее сообщение. Также следует отметить, что любой сетевой код должен выполняться в своем собственном потоке, чтобы не блокировать поток пользовательского интерфейса.

...