Способ, которым вы добавили флаги к последнему параметру для recv()
, подойдет. Кажется, вы не понимаете, что будет делать MSG_DONTWAIT
.
Флаг MSG_DONTWAIT
вызовет выполнение вызова recv()
как неблокирующую операцию. Это означает, что он вернет -1
с errno
, установленным на EAGAIN
или EWOULDBLOCK
, если нет данных для возврата.
MSG_DONTWAIT
(так как Linux 2.2)
- Включает неблокирующую операцию; если операция блокируется, вызов завершается с ошибкой
EAGAIN
или EWOULDBLOCK
. Это обеспечивает поведение, аналогичное настройке флага O_NONBLOCK
(с помощью операции fcntl
(2) F_SETFL
), но отличается тем, что MSG_DONTWAIT
является опцией для каждого вызова ...
man 2 recv
Если вы хотите, чтобы recv()
блокировался до тех пор, пока не будут возвращены данные, снимите флаг MSG_DONTWAIT
и убедитесь, что Гнездо не установлено O_NONBLOCK
.