Будет ли этот код проверять все, что я хочу, из сокета? - PullRequest
4 голосов
/ 20 августа 2011

Выполнение Socket.Receive (byte []) получит байты из буфера, но если ожидаемые данные достаточно велики, все байты могут еще не быть в буфере, что даст мне лишь частично заполненный массив байтов. Будет ли этот код гарантировать, что я прочитал все, что я хочу?

sock.Receive(message_byte, message_byte.Length, SocketFlags.None);

где message_byte уже объявлен как точный размер ожидаемых данных. Я иду об этом в правильном направлении? Ничто из этого дескриптора не будет больше, чем ~ 10 мегабайт, поэтому вряд ли у меня будет OutOfMemoryException при объявлении байтового массива.

Ответы [ 2 ]

9 голосов
/ 20 августа 2011

Нет, Receive возвращает количество полученных байтов.Вы должны правильно справиться с этим.

var needBytes = message_byte.Length;
var receivedBytes;
var totalReceivedBytes = 0;
do
{
    receivedBytes = sock.Receive(message_byte, totalReceivedBytes, needBytes, SocketFlags.None);
    needBytes -= receivedBytes;
    totalReceivedBytes += receivedBytes;
} while (needBytes > 0 && receivedBytes > 0)
3 голосов
/ 20 августа 2011

Нет, код не гарантирует получение полного сообщения. Вы должны проверить количество полученных байтов и выполнить цикл, пока не получите полное сообщение.

Имейте в виду, что вы также можете начать получать часть следующего сообщения, если несколько сообщений отправляются последовательно от клиента. Например, если ваше сообщение имеет размер 100 байт, первый вызов может вернуть 60 байт, и вы будете выполнять цикл и снова читать и получать 58 байт, что означает, что вы получили 100 байт первого сообщения и первых 18 байт следующего сообщения, так что вам нужно правильно обработать это.

Примечание. Вы не можете делать какие-либо предположения о том, как байты будут разделяться по мере их получения. Это всего лишь поток, и операционная система уведомит вас о том, что она начнет получать данные, без какой-либо концепции формирования сообщений, и вам остается только управлять.

Надеюсь, что это имеет смысл.

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