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

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

Жанры

UNIX: разработка сетевых приложений
Шрифт:

2. Описывая в разделе 6.3 условия, при которых функция

select
сообщает, что дескриптор готов для записи, мы указали, что сокет должен быть неблокируемым, для того чтобы операция записи возвратила положительное значение. Почему?

3. Что произойдет с программой из листинга 6.1, если мы поставим слово

else
перед
if
в строке 19?

4. В листинге 6.3 добавьте необходимый код, чтобы позволить серверу использовать максимальное число дескрипторов, допустимое ядром ( Подсказка: изучите функцию

setrlimit
.)

5. Посмотрите, что происходит, если в качестве второго аргумента функции

shutdown
передается
SHUT_RD
. Возьмите за основу
код клиента TCP, представленный в листинге 5.3, и выполните следующие изменения: вместо номера порта
SERV_PORT
задайте порт 19 (служба
chargen
, см. табл. 2.1), а также замените вызов функции
str_cli
вызовом функции
pause
. Запустите программу, задав IP-адрес локального узла, на котором выполняется сервер
chargen
. Просмотрите пакеты с помощью такой программы, как, например,
tcpdump
(см. раздел В.5). Что происходит?

6. Почему приложение должно вызывать функцию

shutdown
с аргументом
SHUT_RDWR
, вместо того чтобы просто вызвать функцию
close
?

7. Что происходит в листинге 6.4, когда клиент отправляет RST для завершения соединения?

8. Перепишите код, показанный в листинге 6.5, чтобы вызывать функцию

sysconf
для определения максимального числа дескрипторов и размещения соответствующего массива
client
в памяти.

Глава 7

Параметры сокетов

7.1. Введение

Существуют различные способы получения и установки параметров сокетов:

функции

getsockopt
и
setsockopt
;

функция

fcntl
;

функция

ioctl
.

Эту главу мы начнем с описания функций

getsockopt
и
setsockopt
. Далее мы приведем пример, в котором выводятся заданные по умолчанию значения параметров, а затем дадим подробное описание всех параметров сокетов. Мы разделили описание параметров на следующие категории: общие, IPv4, IPv6, TCP и SCTP. При первом прочтении главы можно пропустить подробное описание параметров и при необходимости прочесть отдельные разделы, на которые даны ссылки. Отдельные параметры подробно описываются в дальнейших главах, например параметры многоадресной передачи IPv4 и IPv6 мы обсуждаем в разделе 19.5.

Мы также рассмотрим функцию

fcntl
, поскольку она реализует предусмотренные стандартом POSIX возможности отключить для сокета блокировку ввода-вывода, включить управление сигналами, а также установить владельца сокета. Функцию
ioctl
мы опишем в главе 17.

7.2. Функции getsockopt и setsockopt

Эти две функции применяются только к сокетам.

#include <sys/socket.h>

int getsockopt(int sockfd, int level, int optname, void * optval, socklen_t * optlen);

int setsockopt(int sockfd, int level, int optname, const void * optval, socklen_t optlen);

Обе функции возвращают 0 в случае успешного завершения, -1 в случае ошибки

Переменная

sockfd
должна ссылаться на открытый дескриптор сокета. Переменная
level
определяет, каким кодом должен интерпретироваться параметр: общими программами обработки сокетов или зависящими от протокола программами (например, IPv4, IPv6, TCP или SCTP).

optval
— это указатель на переменную, из которой извлекается новое значение
параметра с помощью функции
setsockopt
или в которой сохраняется текущее значение параметра с помощью функции
getsockopt
. Размер этой переменной задается последним аргументом. Для функции
setsockopt
тип этого аргумента — значение, а для функции
getsockopt
— « значение-результат».

В табл. 7.1 и 7.2 сведены параметры, которые могут запрашиваться функцией

getsockopt
или устанавливаться функцией
setsockopt
. В колонке «Тип данных» приводится тип данных того, на что указывает указатель
optval
для каждого параметра. Две фигурные скобки мы используем, чтобы обозначить структуру, например
linger{}
обозначает
struct linger
.

Таблица 7.1. Параметры сокетов для функций getsockopt и setsockopt

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

Приручитель женщин-монстров. Том 7

Дорничев Дмитрий
7. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 7

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя

Неудержимый. Книга VI

Боярский Андрей
6. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга VI

Сыночек в награду. Подари мне любовь

Лесневская Вероника
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Жандарм 4

Семин Никита
4. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 4

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Сломанная кукла

Рам Янка
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сломанная кукла

Отмороженный 3.0

Гарцевич Евгений Александрович
3. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 3.0

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие
level optname get set Описание Флаг Тип данных
SOL_SOCKET SO_BROADCAST Позволяет посылать широковещательные дейтаграммы int
SO_DEBUG Разрешает отладку int
SO_DONTROUTE Обходит таблицу маршрутизации int
SO_ERROR Получает ошибку, ожидающую обработки, и возвращает значение параметра в исходное состояние int
SO_KEEPALIVE Периодически проверяет, находится ли соединение в рабочем состоянии int
SO_LINGER Задерживает закрытие сокета, если имеются данные для отправки linger{}
SO_OOBINLINE Оставляет полученные внеполосные данные вместе с обычными данными (inline) int
SO_RCVBUF Размер приемного буфера int
SO_SNDBUF Размер буфера отправки int
SO_RCVLOWAT Минимальное количество данных для приемного буфера сокета int
SO_SNDLOWAT Минимальное количество данных для буфера отправки сокета int
SO_RCVTIMEO Тайм-аут при получении timeval{}
SO_SNDTIMEO Тайм-аут при отправке timeval{}