Linux: Полное руководство
Шрифт:
♦ sin_zero — обычно не используется.
Структура struct in_addr, определяющая адрес узла, также описана в файле
Обычно поле s_addr должно принимать значение INADDR_ANY — сейчас поясню почему. Структура sockaddr_in должна быть заполнена ДО вызова функции bind. Если поле sin_addr.s_addr принимает значение INADDR_ANY, то функция bind автоматически привяжет к сокету адрес локального компьютера и нам не нужно будет
Функция bind возвращает 0 в случае успеха, и -1, если произошла ошибка. Вот небольшой пример использования этой функции:
27.3.3. Установление связи с удаленным компьютером
Устанавливать связь можно как на стороне сервера, так и на стороне клиента. На стороне клиента используется только один вызов — connect, который «спрашивает» у сервера: «Могу ли я подключиться?», то есть передает запрос на установление соединения. На сервере используются функции:
♦ listen — ожидание клиента;
♦ accept — подтверждение запроса клиента на установление соединения.
Сервер должен постоянно прослушивать сокет — ожидать новых клиентов. Как только новый клиент посылает запрос на установление соединения, сервер может либо разрешить ему подключиться (connect), либо запретить (например, если сервер уже обслуживает другого клиента).
Вызов listen «заставляет» программу-сервер работать в режиме ожидания запроса на соединение от клиента. Прототип этой функции следующий:
Первый параметр — это дескриптор сокета, а второй — максимальное количество запросов на установление связи (другими словами, максимальное количество клиентов).
Как и функция bind, функция listen в случае успеха возвращает 0. Пример вызова функции:
Используется программой-клиентом для отправки запроса на подключение к серверу. Прототип функции следующий:
Первый параметр — это дескриптор сокета, созданного функцией socket и привязанного функцией bind. Привязку сокета функцией bind выполнять не обязательно: если сокет не был привязан до вызова connect, привязка будет выполнена автоматически.
Второй параметр — это указатель на структуру типа sockaddr_in, содержащую
информацию о сервере: его IP-адрес, номер порта, а также семейство протоколов.Последний параметр — это размер структуры sockaddr_in в байтах. В случае успеха функция возвращает 0, а в случае ошибки —1.
Вот пример использования вызова connect:
Если вы используете режим без установления соединения (SOCK_DGRAM), вызов connect необязателен.
Если максимальное число клиентов не превышено, сервер может принять запрос клиента. Для этого используется функция accept. Данная функция используется только при работе в режиме с установлением соединения. Прототип функции следующий:
Первый параметр — это дескриптор сокета, второй — указатель на структуру, где можно разместить адрес клиента, причем данную структуру инициализировать не нужно. Последний параметр — размер структуры, указанной во втором параметре.
Системный вызов accept работает так. Сначала он извлекает из очереди listen запрос на соединение и создает новый сокет, через который будет производиться обмен данными с клиентом, например:
Если вызов accept завершился успехом, структура addr, задаваемая во втором параметре, будет содержать IP-адрес клиента.
Если очередь listen пуста, то наш сервер будет ожидать появления нового клиента. В случае ошибки функция accept возвращает отрицательное значение.
27.3.4. Функция gethostbyname
Пользователям обычно удобнее указать символьное имя сервера, чем его IP-адрес. Для разрешения имени служит функция gethostbyname. Вот ее прототип:
Данная функция возвращает указатель на структуру типа hostent, содержащую следующие поля:
♦ char *h_name — доменное имя узла;