По крайней мере, в Windows вы можете использовать ioctlsocket()
с командой FIONREAD
, чтобы определить текущее число байтов, доступных для recv()
для чтения без блокировки.К тому времени, когда вы на самом деле вызываете recv()
, возможно, поступило больше байтов.
Как сказал @LokiAstari, вы должны вызывать recv()
в цикле, пока он не вернет 0 байтов, чтобы указать, что сокетзакрыто.Вам не нужно знать, сколько байтов доступно, просто передавайте буфер фиксированной длины каждый раз, и recv()
вернет, сколько байтов было фактически прочитано.Добавьте каждое чтение буфера ненулевой длины в другой буфер, который увеличивается по мере необходимости, пока вы не получите все данные, а затем обработайте этот второй буфер, когда будете готовы.