Стандартные сокеты TCP. Подскажите по возвращаемым значениям: - read - recv В случае: - стандартного завершения соединения отправителем - разрыва соединения (вследствие неполадок сети, аварийного завершения отправителя и т.д.) - таймаута - другие варианты? В ОС: - Windows - Linux Всякие нестандартные соединения через прокси, с кешированием и т.п. тоже интересуют. И еще вопрос: read (Linux) может вернуть меньше байт чем было запрошено/отправлено, остальные можно дополучить последующими чтениями. Возможна ли ситуация когда read возвращает 0, но последующее чтение сокета получает данные? Или read блокирует пока не придет хотя бы 1 байт (либо ошибка?). А также что по поводу recv, может ли этот вызов считать меньше байт чем запрошено?
Функция возвращает отрицательное число, если произошла ошибка и соединение больше использовать нельзя (но надо закрыть со своей стороны). Если сокет открыт в блокирующем режиме, функция возвращает 0, если соединение было закрыто с другой стороны не отправив никаких данных (соединение надо закрыть со своей стороны), иначе возвращает количество прочитанных байт; количество прочитанных байт может быть меньше запрошенного и меньше отправленного, TCP - это потоковый протокол, он рассматривает данные как последовательность байт, без каких-либо границ блоков. В неблокирующем режиме функция возвращает управление сразу, скопировав в буфер то, что есть во входном буфере или вернув 0, если данные еще не получены. Надо вызывать GetLastError(), чтобы узнать почему она вернула 0 - из-за закрытия соединения с другой стороны или потому что данные еще не получены.
Это про recv/Windows, верно? Принято, спасибо. В блокирующем режиме принципиально возможен вариант если возвращается 0, но сокет не закрыт?
И read, и recv, и ReadFile (результат в dwNumberOfBytesRead). Только если overlapped I/O будешь использовать. А так, если самые обычные сокеты как по учебнику, то нет - 0 значит, что соединение закрыто пиром.