Как мы можем найти, что все байты получают из сокетов? - PullRequest
1 голос
/ 21 февраля 2011

Я хочу знать, когда мы получим все байты из сокета без Socket.Disconnect () метод

Тем не менее, я использую этот код для получения всех байтов, но я использую метод Socket.Disconnect (), когда метод Scoket.Send (byte []) завершен.

List<byte> LBytes = new List<byte>();
do
{
System.Threading.Thread.Sleep(50);
BytesRead = obj_socket.Receive(obj_buffer, 0);
LBytes.Append(obj_buffer);
} while (BytesRead != 0);

потому что когда мы отключаем сокет, сокет читает 0 байтов. например, мы отправили 100 000 байтов, и мы должны получить 100 000 байтов. Как ты это делаешь?

1 Ответ

3 голосов
/ 21 февраля 2011

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

Есть несколько способов сделать это:

  • закрыть сокет после отправки
  • имеет некоторый маркер, который означает «конец сообщения» (достаточно просто с закодированным текстом - 0 является обычным выбором; хотя сложно посылать произвольные двоичные данные)
  • отправляет префикс длины перед данными (в нашем случае 100 000), и прекращает чтение , когда вы получаете столько

Если это был NetworkStream, например, с использованием префикса длины:

int expecting = //TODO: read header in your chosen form
int bytesRead;
while(expecting > 0 && (bytesRead = stream.Read(buffer, 0,
        Math.Min(expecting, buffer.Length))) > 0)
{
    // TODO: do something with the newly buffered data
    expecting -= bytesRead;
}
...