Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

♦ SO_ERROR — возвращает номер ошибки (будет в возвращаемом значении);

♦ SO_TYPE — возвращает тип сокета.

Рассмотрим небольшой пример работы с опциями сокетов. Мы установим размер буфера TCP.

#include "sock.h"

#include "stdio.h"

main {

 int sd; /* дескриптор сокета */

 int optval; /* значение опции */

 int optlen; /* длина optval */

 int new_buffsize = 8192; /* новый размер буфера */

 /* создаем сокет */

 sd = socket(AF_INET, SOCK_STREAM, 0);

 /* считывание длины буфера TCP */

 optlen = sizeof(optval);

 getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);

 printf("Size of send buffer %d\n", optval);

 getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);

 printf("Size of recv buffer %d\n", optval);

 /* изменяем длину буфера */

 setsockopt(sd, SOL_SOCKET, SO_RCVBUF,

&new_buffsize, sizeof(new_buffsize));

 setsockopt(sd, SOL_SOCKET, SO_SNDBUF,

&new_buffsize, sizeof(new_buffsize));

 /* выводим измененную информацию */

 getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen);

 printf("New size of send buffer %d\n", optval);

 getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);

 printf("New size of recv buffer %d\n", optval);

}

27.3.10. Сигналы и сокеты

С сокетами связаны три сигнала:

♦ SIGIO — сокет готов к вводу/выводу. Сигнал посылается процессу, который связан с сокетом;

♦ SIGURG — сокет получил экспресс-данные (мы их использовать не будем, поэтому особо останавливаться на них нет смысла);

♦ SIGPIPE — запись в сокет больше невозможна. Сигнал посылается процессу, связанному с сокетом. Например, функция write вызывает сигнал SIGPIPE, если удаленный процесс завершен или связь по сети невозможна.

Пример обработки сигнала SIGPIPE приведен ниже.

Листинг 27.6. Обработка сигнала SIGPIPE

#include "sock.h"

#include <signal.h>

/* обработчик сигнала SIGPIPE */

sigpipe_handler {

 err_quit("Получен SIGPIPE \n");

}

main {

 int sock; /* дескриптор сокета */

 /* установка обработчика сигнала SIGPIPE */

 signal(SIGPIPE, sigpipe_handler);

 /* работа с сокетом */

}

27.3.11. Мультиплексирование

В этой главе мы рассматривали пример программы-сервера, обрабатывающей запросы только от одного клиента. На практике все выглядит намного сложнее: серверу приходится одновременно обрабатывать запросы многих клиентов. Для мультиплексирования запросов клиентов используется системный вызов select. Этот вызов использует, например, суперсервер xinetd.

Листинг 27.7. Мультиплексирование запросов

#include "sock.h"

#include <sys/time.h>

main {

 int sock; /* дескриптор исходного сокета */

 int new_sock; /* дескриптор, полученный с помощью accept */

 int retval; /* возвращаемое значение */

 struct sockaddr_in server; /* адрес сокета */

 fd_set readv; /* переменная для select */

 fd_set writev; /* переменная для select */

 struct timeval tout; /* тайм-аут для select */

 /* бесконечный цикл ожидания */

 for (;;) {

/* процесс ждет операцию ввода-вывода на сокете;

одновременно можно ждать и другие операции */

FD_ZERO(&readv);

FD_ZERO(&writev);

FD_SET(sock, &readv);

FD_SET(sock, &writev);

tout.tv_sec = 10; /* 10 секунд */

retval = select(sock+1, &readv, &writev, 0, &to);

/* если select возвращает нулевое значение, значит тайм-аут */

if (retval == 0) {

err_ret("timeout");

continue;

}

/* в противном случае, ищем соответствующий дескриптор */

if ( (FD_ISSET(sock, &readv)) || (FD_ISSET(sock, &writev))) {

/* прием связи с сокета */

new_sock = accept(sock, (struct sockaddr *)0, (int *)0);

/* работа с сокетом new_sock */

...

/* закрытие текущей связи */

close(new_sock);

} else {

err_ret("Это не сокет! Проверьте все дескрипторы\n");

Поделиться:
Популярные книги

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Первый среди равных. Книга XIII

Бор Жорж
13. Первый среди Равных
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга XIII

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Особый агент

Кулаков Сергей Федорович
Спецназ. Группа Антитеррор
Детективы:
боевики
7.00
рейтинг книги
Особый агент

Наследник

Старый Денис
1. Внук Петра
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Наследник

Помещик

Беличенко Константин
1. Помещик
Фантастика:
боевая фантастика
попаданцы
5.56
рейтинг книги
Помещик

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Лекарь Империи 8

Лиманский Александр
8. Лекарь Империи
Фантастика:
попаданцы
городское фэнтези
аниме
5.00
рейтинг книги
Лекарь Империи 8

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Гранит науки. Том 2

Зот Бакалавр
2. Героями не становятся, ими умирают
Фантастика:
фэнтези
5.00
рейтинг книги
Гранит науки. Том 2

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Двойник Короля 6

Скабер Артемий
6. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 6

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7