Розетки.Правильно получить ответ - PullRequest
0 голосов
/ 09 октября 2018

У меня проблемы с http-запросами, которые «иногда» не выполняются.

var bodyBuilder = new List<byte>(4096);
var buffer = new byte[256];
while (socket.Available > 0) {
    var responseLength = socket.Receive(buffer, buffer.Length, SocketFlags.None);

    for (var i = 0; i < responseLength; i++)
        bodyBuilder.Add(buffer[i]);

    if (responseLength == 0)
        break; // never true btw
}

Я прочитал, что socket.Available > 0 не следует использовать, поскольку он не указывает, закончен ли сокет или нет, но"если есть данные на этот раз" https://www.coderanch.com/how-to/java/AvailableDoesntDoWhatYouThinkItDoes (хотя не на C # и не на сокетах)

Это имеет смысл, потому что я получаю исключения при попытке разобрать ответ.Даже при ручном прохождении отладчика данные поступают правильно, потому что я делаю это медленно, когда перехожу через

. Решение было бы заменить while (socket.Available > 0) на while (true), поскольку responseLength будетбыть 0, когда сервер закрывает соединение.(согласно многим источникам) Но это НЕ то, что происходит.Если я выполню socket.Recieve() и нет доступных данных.Сокет просто блокируется на неопределенный срок.

Любая помощь?

1 Ответ

0 голосов
/ 09 октября 2018

Да, Available необходимо удалить.Сокет обычно должен иметь один ожидающий чтения.Не должно быть никакой проверки, если есть данные.Просто прочитайте и поработайте с результатом.

Если я выполню socket.Recieve () и данных нет.Сокет просто блокируется на неопределенный срок.

Это означает ... что нет доступных данных.Другая сторона не отправила больше того, что вы уже прочитали.

Это можно решить двумя способами:

  1. Определить, что по протоколу больше нет данных.Например, префикс длины ваших данных.Затем вы знаете, сколько читать.
  2. Сделайте так, чтобы другая сторона выключила сокет, чтобы ваше чтение закончилось и вернуло нулевые прочитанные байты.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...