C - Как добавить несколько флагов - PullRequest
1 голос
/ 22 февраля 2020

Это правильный способ добавить несколько флагов в функцию?

recv(sfd, &buf, sizeof(buf), MSG_DONTWAIT | MSG_ERRQUEUE);

В моем buf не появляется сообщение об ошибке.
recv() не блокируется.
Я получаю сообщение об ошибке: 11, где написано "попробуй еще раз".

1 Ответ

0 голосов
/ 22 февраля 2020

Способ, которым вы добавили флаги к последнему параметру для 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.

...