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

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

Жанры

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.50
рейтинг книги
Медная шкатулка (сборник)

Ответная операция. В погоне за Призраком

Ардаматский Василий Иванович
11. Библиотека приключений
Проза:
военная проза
5.00
рейтинг книги
Ответная операция. В погоне за Призраком

Глобус 1976

Коллектив авторов
Приключения:
путешествия и география
7.00
рейтинг книги
Глобус 1976

Прозрение (сборник)

Ле Гуин Урсула Кребер
12. Вся Ле Гуин
Фантастика:
фэнтези
6.25
рейтинг книги
Прозрение (сборник)

Магистр. Трилогия

Степанов Николай Викторович
Магистр [Воронцов]
Фантастика:
научная фантастика
7.00
рейтинг книги
Магистр. Трилогия

Бриллианты Юстэсов

Троллоп Энтони
3. Романы о Плантагенете Паллисьере
Проза:
современная проза
5.00
рейтинг книги
Бриллианты Юстэсов

Последний реанорец. Том III

Павлов Вел
2. Высшая Речь
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Последний реанорец. Том III

Аромалогия. Quantum Satis

Миргородская Светлана
Дом и Семья:
здоровье и красота
6.60
рейтинг книги
Аромалогия. Quantum Satis

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Стена глаз. Земля - пустыня. Флаг в тумане

Мацумото Сэйте
Мастера остросюжетного детектива
Детективы:
прочие детективы
5.00
рейтинг книги
Стена глаз. Земля - пустыня. Флаг в тумане

Хроники Максима. Трилогия

Бадей Сергей
Фантастика:
юмористическое фэнтези
8.26
рейтинг книги
Хроники Максима. Трилогия

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

СТРУНА ИСТОРИИ

Гумилев Лев Николаевич
Проза:
современная проза
5.00
рейтинг книги
СТРУНА ИСТОРИИ

Борис Березовский. Человек, проигравший войну

Бушков Александр Александрович
Документальная литература:
биографии и мемуары
прочая документальная литература
публицистика
4.00
рейтинг книги
Борис Березовский. Человек, проигравший войну