Мультиплексирование с помощью select ()
Здесь мы приводим пример использования сокетов с примитивом select (), рассмотренным в главе 1.
ПРОГРАММА 28 /* использование функции select() для определения, готовыли данные на сокете сервера TCP */ #include "soct.h" #include <sys/time.h> main() { int sock; /* дескриптор исходного сокета */ int nsock; /* дескриптор, полученный с по- мощью accept */ int retour; /* возвращаемое значение */ struct sockaddr_in server;/* адрес сокета */ fd_set readf; /* переменная для select */ fd_set writef; /* переменная для select */ struct timeval to; /* тайм-аут для select */
/* бесконечный цикл ожидания */ for (;;) { /* процесс ждет операцию ввода-вывода на сокете ; одновременно можно ждать и другие операции */ FD_ZERO(&readf); FD_ZERO(&writef); FD_SET(sock, &readf); FD_SET(sock, &writef); to.tv_sec = 10;
retour = select(sock+1, &readf, &writef, 0, &to); /* тайм-аут, если select возвращает нулевое значение */ if (retour == 0) { err_ret("timeout"); continue; } /* в противном случае, ищем соответствующий дескриптор */ if ( (FD_ISSET(sock, &readf)) (FD_ISSET(sock, &writef))) { /* прием связи с сокета */ nsock = accept(sock, (struct sockaddr *) 0, (int *)0); /* обращение к соответствующей службе */ serveur(nsock); /* закрытие текущей связи */ close (nsock);
} else { /* это не сокет; надо проверить все дескрипторы ввода-вывода*/ err_ret("autre descripteur"); } } }