Книга: Основы программирования в Linux

Запросы соединений

Запросы соединений

Клиентские программы подключаются к серверам, устанавливая соединение между неименованным сокетом и сокетом сервера, ждущим подключений. Делают они это с помощью вызова connect:

#include <sys/socket.h>
int connect(int socket, const struct sockaddr *address, size_t address_len);

Сокет, заданный в параметре socket, соединяется с сокетом сервера, заданным в параметре address, длина которого равна address_len. Сокет должен задаваться корректным файловым дескриптором, полученным из системного вызова socket.

Если функция connect завершается успешно, она возвращает 0, в случае ошибки вернется -1. Возможные ошибки на этот раз включают значения, перечисленные в табл. 15.3.

Таблица 15.3

Значение errno Описание
EBADF В параметре socket задан неверный файловый дескриптор
EALREADY Для этого сокета соединение уже обрабатывается
ETIMEDOUT Допустимое время ожидания соединения превышено
ECONNREFUSED Запрос на соединение отвергнут сервером

Если соединение не может быть установлено немедленно, вызов connect будет заблокирован на неопределенный период ожидания. Когда допустимое время ожидания будет превышено, соединение разорвется и вызов connect завершится аварийно. Однако, если вызов прерван сигналом, который обрабатывается, connect завершится аварийно (со значением errno, равным EINTR), но попытка соединения не будет прервана — соединение будет установлено асинхронно и программа должна будет позже проверить, успешно ли оно установлено.

Как и в случае вызова accept, возможность блокировки в вызове connect можно исключить установкой в файловом дескрипторе флага O_NONBLOCK. В этом случае, если соединение не может быть установлено немедленно, вызов connect завершится аварийно с переменной errno, равной EINPROGRESS, и соединение будет выполнено асинхронно.

Хотя асинхронные соединения трудно обрабатывать, вы можете применить вызов select к файловому дескриптору сокета, чтобы убедиться в том, что сокет готов к записи. Мы обсудим вызов select чуть позже в этой главе.

Оглавление книги


Генерация: 1.979. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз