Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Длина и формат адреса зависят от адресного семейства. В системном вызове
bind(struct sockaddr*)В случае успешного завершения
binderrnoТаблица 15.2
Значение errno | Описание |
|---|---|
EBADF | Неверный файловый дескриптор |
ENOTSOCK | Файловый дескриптор не ссылается на сокет |
EINVAL | Файловый дескриптор ссылается на сокет, уже получивший имя |
EADDRNOTAVAIL | Недопустимый адрес |
EADDINUSE | У адреса уже есть связанный с ним сокет |
Для сокетов домена AF_UNIX | |
EACCESS | Невозможно создать имя в файловой системе из-за прав доступа |
ENOTDIRENAMETOOLONG | Означает недопустимое имя файла |
Создание очереди сокетов
Для приема запросов на входящие соединения на базе сокетов серверная программа должна создать очередь для хранения ждущих обработки запросов. Формируется она с помощью системного вызова
listen<b>#include <sys/socket.h></b><b>int listen(int socket, int backlog);</b>Система Linux может ограничить количество ждущих обработки соединений, которые могут храниться в очереди. В соответствии с этим максимумом вызов
listenbackloglistenbacklogФункция
listenbindEBADFEINVALENOTSOCKПрием запросов на соединение
После создания и именования сокета серверная программа может ждать запросы на выполнение соединения с сокетом с помощью системного вызова
accept<b>#include <sys/socket.h></b><b>int accept(int socket, struct sockaddr *address, size_t *address_len);</b>Системный вызов
acceptsocketacceptПредварительно сокету должно быть присвоено имя с помощью системного вызова
bindlistensockaddraddressПараметр
address_lenacceptaddress_lenaddress_lenЕсли нет запросов на соединение, ждущих в очереди сокета, вызов accept будет заблокирован (так что программа не сможет продолжить выполнение) до тех пор, пока клиент не сделает запрос на соединение. Вы можете изменить это поведение, применив флаг
O_NONBLOCKfcntlint flags = fcntl(socket, F_GETFL, 0);fcntl(socket, F_SETFL, O_NONBLOCK | flags);Функция
acceptbindlistenEWOULDBLOCKO_NONBLOCKEINTRacceptЗапросы соединений
Клиентские программы подключаются к серверам, устанавливая соединение между неименованным сокетом и сокетом сервера, ждущим подключений. Делают они это с помощью вызова
connect<b>#include <sys/socket.h></b><b>int connect(int socket, const struct sockaddr *address, size_t address_len);</b>Сокет, заданный в параметре
socketaddressaddress_lensocketЕсли функция
connect