tcp sockets: возвращаемые значения read, recv

Тема в разделе "WASM.NETWORKS", создана пользователем ormoulu, 4 апр 2022.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.206
    Стандартные сокеты TCP.
    Подскажите по возвращаемым значениям:
    - read
    - recv
    В случае:
    - стандартного завершения соединения отправителем
    - разрыва соединения (вследствие неполадок сети, аварийного завершения отправителя и т.д.)
    - таймаута
    - другие варианты?
    В ОС:
    - Windows
    - Linux

    Всякие нестандартные соединения через прокси, с кешированием и т.п. тоже интересуют.

    И еще вопрос: read (Linux) может вернуть меньше байт чем было запрошено/отправлено, остальные можно дополучить последующими чтениями. Возможна ли ситуация когда read возвращает 0, но последующее чтение сокета получает данные? Или read блокирует пока не придет хотя бы 1 байт (либо ошибка?). А также что по поводу recv, может ли этот вызов считать меньше байт чем запрошено?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Функция возвращает отрицательное число, если произошла ошибка и соединение больше использовать нельзя (но надо закрыть со своей стороны).

    Если сокет открыт в блокирующем режиме, функция возвращает 0, если соединение было закрыто с другой стороны не отправив никаких данных (соединение надо закрыть со своей стороны), иначе возвращает количество прочитанных байт; количество прочитанных байт может быть меньше запрошенного и меньше отправленного, TCP - это потоковый протокол, он рассматривает данные как последовательность байт, без каких-либо границ блоков.

    В неблокирующем режиме функция возвращает управление сразу, скопировав в буфер то, что есть во входном буфере или вернув 0, если данные еще не получены. Надо вызывать GetLastError(), чтобы узнать почему она вернула 0 - из-за закрытия соединения с другой стороны или потому что данные еще не получены.
     
    M0rg0t нравится это.
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.206
    Это про recv/Windows, верно? Принято, спасибо.
    В блокирующем режиме принципиально возможен вариант если возвращается 0, но сокет не закрыт?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    И read, и recv, и ReadFile (результат в dwNumberOfBytesRead).

    Только если overlapped I/O будешь использовать. А так, если самые обычные сокеты как по учебнику, то нет - 0 значит, что соединение закрыто пиром.