recv с MESSAGE_NONBLOCK и MESSAGE_WAITALL

Я хочу использовать recv syscall с неблокированием флагов MESSAGE_NONBLOCK. Но с этим флагом syscall может возвратиться, прежде чем полный запрос удовлетворен. Так,

  • я могу добавить флаг MESSAGE_WAITALL? Это будет не блокироваться?
  • или как я должен переписать блокирование recv в цикл с неблокированием recv
9
задан osgx 31 May 2010 в 12:13
поделиться

1 ответ

EDIT:

Обычная recv() вернет все, что находится в буфере tcp на момент вызова, вплоть до запрошенного количества байт. MSG_DONTWAIT просто избегает блокировки, если на сокете нет данных, готовых к чтению. MSG_WAITALL требует блокировки до тех пор, пока не будет прочитано все запрошенное количество байт. Поэтому вы не получите поведение "все или ничего". В лучшем случае вы получите EAGAIN, если данных нет, и блокировку до тех пор, пока не будет доступно все сообщение.

Возможно, вы сможете сделать что-то из MSG_PEEK или ioctl() с FIONREAD (если ваша система поддерживает это), что эффективно ведет себя так, как вы хотите, но я не знаю, как вы можете достичь своей цели, используя только флаги recv().

3
ответ дан 4 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: