Как указано в комментариях, 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
Возможно, на сокете установлено ненулевое время ожидания приема (через setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, ...)
), поскольку это также приведет к возврату recv EAGAIN
Я не предлагаю это как исправление с первой попытки , но если у вас нет выбора, вы всегда можете select ()
на сокете с достаточно большим таймаутом, чтобы заставить его ждать данных.
Возможно ли, что вы используете MSG_DONTWAIT
указывается как часть ваших флагов? На странице man
написано, что EAGAIN
произойдет, если нет доступных данных, и указан этот флаг.
Если вы действительно хотите форсировать блок до recv ()
несколько успешен, вы можете использовать флаг MSG_WAITALL
.