sendfile () завершение в неблокирующий сокет - PullRequest
2 голосов
/ 20 декабря 2009

В моей программе мне нужно проверить завершение операции sendfile () в неблокирующем сокете. Как это можно сделать?

После проверки документации и поиска в интернете я не смог найти, как это сделать

1 Ответ

6 голосов
/ 20 декабря 2009

Работает очень похоже на send(): если сокет установлен как O_NONBLOCK и операция блокируется, sendfile() немедленно возвращается и устанавливает errno в EAGAIN. В этом случае вам придется подождать некоторое время, а затем повторить попытку (возможно, с помощью функции, такой как select(), чтобы узнать, когда она будет готова).

Также имейте в виду, что даже если это удастся, он может записать не все байты, запрошенные вами за один вызов функции. Всегда проверяйте возвращаемое значение:

Если передача прошла успешно, число байтов, записанных в out_fd, равно вернулся. При ошибке возвращается -1, и errno устанавливается соответствующим образом.

Вы также можете взглянуть на справочную страницу для sendfile ()

...