Ошибка чтения сокета C # - PullRequest
       2

Ошибка чтения сокета C #

0 голосов
/ 19 августа 2010

В моей программе я создаю сокет, и когда клиент подключается, я создаю новый поток и пытаюсь читать и записывать из / в подключенный к этому сокету, но всегда получаю ошибку чтения, потому что хост-компьютер закрыл соединение для второгокоманда, первая команда от клиента WIFFs отлично, а третья работает нормально.я пытаюсь проверить, подключен ли clientSocket и читаем ли networkStream, и они всегда возвращают true.как я могу решить это?и как это может быть - networkStream.CanRead возвращает true, но networkStreamRead вызывает ошибку?Я новичок в C # и программировании сокетов, так что извините за тупой вопрос.

clientSocket это TcpClient
networkStream это NetworkStream

if (clientSocket.Connected == true)
{
   requestCount = requestCount + 1;
   networkStream = clientSocket.GetStream();
   if (networkStream.CanRead == true)
   {
         networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
         dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
   }

}

1 Ответ

3 голосов
/ 19 августа 2010

Свойство NetworkStream.CanRead указывает только на то, что поток поддерживает чтение , вовсе не означает, что данные доступны.При чтении из сети вы всегда должны продолжать чтение, пока не будет завершен весь кадр, где значение кадра полностью зависит от протокола: это может означать заголовок размера преамбулы, терминатор, такой как \ 0x0A, или специальную последовательность, например, одну точкуна линии.Пока фрейм неполный, вы должны продолжать отправлять буферы приема или читать из потока, если используете потоковый API.

Вторая проблема заключается в том, что вы, очевидно, должны ограничивать себя в интерпретации только байтов.Вы получили , а не весь размещенный буфер.NetworkStream.Read возвращает фактическое число полученных байтов, доступных на данный момент, все, что после этого в буфере, является мусором:

networkStream = clientSocket.GetStream();
int bytesReceived = networkStream.Read(
   bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(
   bytesFrom, 0, bytesReceived);

Это по-прежнему не правильно обрабатывает разделитель кадров, так как вы не знаете, еслиdataFromClient - это все данные от клиента, но это полностью зависит от протокола.

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