Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Длина и формат адреса зависят от адресного семейства. В системном вызове
bind
(struct sockaddr*)
В случае успешного завершения
bind
errno
Таблица 15.2
Значение errno | Описание |
---|---|
EBADF | Неверный файловый дескриптор |
ENOTSOCK | Файловый дескриптор не ссылается на сокет |
EINVAL | Файловый дескриптор ссылается на сокет, уже получивший имя |
EADDRNOTAVAIL | Недопустимый адрес |
EADDINUSE | У адреса уже есть связанный с ним сокет |
Для сокетов домена AF_UNIX | |
EACCESS | Невозможно создать имя в файловой системе из-за прав доступа |
ENOTDIR ENAMETOOLONG | Означает недопустимое имя файла |
Создание очереди сокетов
Для приема запросов на входящие соединения на базе сокетов серверная программа должна создать очередь для хранения ждущих обработки запросов. Формируется она с помощью системного вызова
listen
<b>#include <sys/socket.h></b>
<b>int listen(int socket, int backlog);</b>
Система Linux может ограничить количество ждущих обработки соединений, которые могут храниться в очереди. В соответствии с этим максимумом вызов
listen
backlog
listen
backlog
Функция
listen
bind
EBADF
EINVAL
ENOTSOCK
Прием запросов на соединение
После создания и именования сокета серверная программа может ждать запросы на выполнение соединения с сокетом с помощью системного вызова
accept
<b>#include <sys/socket.h></b>
<b>int accept(int socket, struct sockaddr *address, size_t *address_len);</b>
Системный вызов
accept
socket
accept
Предварительно сокету должно быть присвоено имя с помощью системного вызова
bind
listen
sockaddr
address
Параметр
address_len
accept
address_len
address_len
Если нет запросов на соединение, ждущих в очереди сокета, вызов accept будет заблокирован (так что программа не сможет продолжить выполнение) до тех пор, пока клиент не сделает запрос на соединение. Вы можете изменить это поведение, применив флаг
O_NONBLOCK
fcntl
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, O_NONBLOCK | flags);
Функция
accept
bind
listen
EWOULDBLOCK
O_NONBLOCK
EINTR
accept
Запросы соединений
Клиентские программы подключаются к серверам, устанавливая соединение между неименованным сокетом и сокетом сервера, ждущим подключений. Делают они это с помощью вызова
connect
<b>#include <sys/socket.h></b>
<b>int connect(int socket, const struct sockaddr *address, size_t address_len);</b>
Сокет, заданный в параметре
socket
address
address_len
socket
Если функция
connect