Сплит сообщения через TCP - PullRequest
       2

Сплит сообщения через TCP

0 голосов
/ 04 декабря 2018

У меня небольшие проблемы в универе.Я отправляю tcp-сообщение от клиента C ++ на сервер C #, и сервер получает его в 2 части.Можно ли остановить это от этого?Я вывожу данные, отправленные в моем клиенте, и все данные в один кусок, так что это не может быть.Вот мой метод OnReceiveData:

void OnReceiveData(IAsyncResult result){
        try{
            int readbytes = myStream.EndRead(result);
            if (readbytes <= 0){
                //client is not connected to the server anymore
                CloseSocket();
                return;


            byte[] newBytes = new byte[readbytes];
            Buffer.BlockCopy(readBuff, 0, newBytes, 0, readbytes);
            myStream.BeginRead(readBuff, 0, readbytes, OnReceiveData, 
            null);
            string output = 
            System.Text.Encoding.ASCII.GetString(newBytes, 0, 
            readbytes);
            Text.WriteLog(output);

            ServerHandleData.HandleData(connectionID, newBytes);
        }
        catch (Exception e)
        {
            Text.WriteError("Error Code: " + e);
            CloseSocket();
        }
    } 

Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Нет, TCP - это поток, а не один «кусок» данных.

Как видно из примера EndRead , сообщение может быть прочитано несколькими частями, поэтому выПридется читать части и объединять их.

readbytes = myStream.EndRead(result);
myCompleteMessage = String.Concat(myCompleteMessage,
                                  Encoding.ASCII.GetString(myReadBuffer, 0,
                                                           readbytes));    

// message received may be larger than buffer size so loop through until you have it all.
while(myStream.DataAvailable) {

    myStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
                       new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
                                         myStream);  
}
0 голосов
/ 10 декабря 2018

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

Спасибо за советы, ребята!:)

0 голосов
/ 04 декабря 2018

Нет, нет способа «остановить это», просто работает потоковая TCP.

Короче говоря, поскольку потоковая передача по TCP не имеет границ сообщений.Это просто непрерывный поток байтов.

Чтобы реализовать какой-либо обмен сообщениями или границы между данными, вам нужно придумать собственный протокол прикладного уровня для установки поверх TCP.Например, вы можете ввести какой-то маркер границы сообщения, специальный символ, байт или последовательность символов / байтов, что означает, что текущее сообщение закончилось.Или вы можете отправить заголовок сообщения фиксированного размера, который включает в себя размер фактических данных сообщения.

Затем при получении вам необходимо получать в цикле, пока вы не обнаружите конец сообщения.Для этого самым простым способом является заголовок фиксированного размера с длиной данных, так как тогда вы просто пытаетесь прочитать длину (заголовка или данных), уменьшая количество байтов для получения каждой итерации, пока не останется ничего болееполучить (количество байтов для получения достигает нуля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...