Сокет программируя VB.NET - блоки Чтения неограниченно долго

Следующее является кодом, который я использую для чтения данных по сокету.NET. Эта часть кода выполняется единственным отдельным потоком. Это работает хорошо в первый раз, когда на втором повторении это останавливается в "клиенте. Получите (буферизуют)", и никогда не восстанавливается с него. Первоначально я использовал рекурсию для чтения данных, но изменил его на повторение, думая, что рекурсия могла быть источником проблемы. Но по-видимому это не.

Private Sub ReceiveSocket(ByVal client As Socket)

    Dim bytesRead As Integer = 0

    Do
        bytesRead = client.Receive(buffer)

        sb.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead))

        Array.Clear(buffer, 0, buffer.Length)
    Loop While bytesRead > 0

End Sub 'ReceiveCallback

Почему это зависает в Receive?

1
задан Tshepang 13 October 2014 в 06:35
поделиться

1 ответ

Ну, это нормально. Метод Receive() не вернется, пока сервер не отправит что-то еще. Что он, вероятно, не сделает в вашем случае, пока вы не попросите его сначала отправить что-то еще. Повторно вызывать Receive() следует только в том случае, если вы не получили полный ответ сервера.

Проверьте спецификацию протокола. Обычно сервер посылает что-то, что позволяет вам определить, что полный ответ был получен. Например, количество байт в сообщении. Или специальный символ в конце сообщения. Популярным является символ Linefeed (vbLf).

2
ответ дан 3 September 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: