27.3.12. Неблокирующие операции

27.3.12. Неблокирующие операции

Некоторые функции для работы с сокетами блокируют программу в случае, если удаленный процесс не осуществил требуемую операцию. Примеры таких функций:

? accept();

? connect();

? read();

? write().

Блокирование процесса очень нежелательно, поскольку во время ожидания можно было бы заняться чем-нибудь другим: например, обработать информацию, поступившую с другого сокета. Вы можете объявить сокеты неблокирующими с помощью системного вызовы ioctl().

Особенности работы некоторых функций в неблокирующем режиме:

? функция accept() сразу же завершает работу с ошибкой EWOULDBLOCK;

? функция connect() тоже завершает работу, но с другой ошибкой: EINPROGRESS;

? функции чтения (read(), recv(), recvfrom()) возвращают -1 или 0, если нет считываемых данных.

Ясное дело, что в таком режиме нужно периодически проверять наличие данных — ведь теперь процесс не будет их ожидать: если их нет, то функции просто возвратят -1 или 0.

Пример создания неблокирующих сокетов приведен ниже:

Листинг 27.9. Использование системного вызова ioctl()

#include "sock.h"

#include <sys/ioctl.h>

void main() {

 int sock;

 int on = 1, off = 0; /* значение дня ioctl() */

 /* Создаем неблокирующий сокет */

 ioctl(sock, FIONBIO, &on);

}

Данный текст является ознакомительным фрагментом.