Блокирование сокета возвращает EAGAIN

Как указано в комментариях, OCaml не имеет встроенной поддержки для какого-либо конкретного кодирования, поэтому длина равна количеству байтов.

Теперь, если вы используете кодировку Utf8 (это самый простой способ смешать ascii и CJK AFAIK), есть несколько способов вычислить этот размер.

Например, используя очень легкую библиотеку Uutf [EDIT], как указывает октахрон, это возвращает длину в скалярных значениях, а не в символах, вы должны использовать ответ октахрона.

let utf8_length s = (* returns the number of unicode scalar values *)
 let decoder = Uutf.decoder ~encoding:`UTF_8 (`String s) in
 let rec loop () = match Uutf.decode decoder with | `End -> () | _ -> loop () in
 loop ();
 Uutf.decoder_count decoder

7
задан Barracuda 1 February 2015 в 12:02
поделиться

3 ответа

Возможно, на сокете установлено ненулевое время ожидания приема (через setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, ...) ), поскольку это также приведет к возврату recv EAGAIN

19
ответ дан 6 December 2019 в 09:22
поделиться

Я не предлагаю это как исправление с первой попытки , но если у вас нет выбора, вы всегда можете select () на сокете с достаточно большим таймаутом, чтобы заставить его ждать данных.

0
ответ дан 6 December 2019 в 09:22
поделиться

Возможно ли, что вы используете MSG_DONTWAIT указывается как часть ваших флагов? На странице man написано, что EAGAIN произойдет, если нет доступных данных, и указан этот флаг.

Если вы действительно хотите форсировать блок до recv () несколько успешен, вы можете использовать флаг MSG_WAITALL .

1
ответ дан 6 December 2019 в 09:22
поделиться