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

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

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

 struct in6_addr sin6_addr; /* адрес IPv6 */

 uint32_t sin6_scope_id; /* IPv6-идентификатор */

};

Поля структуры sockaddr_in означают следующее:

♦ sin_ — набор используемых протоколов. Так как мы используем TCP/IP, данное поле должно содержать значение AF_INET;

♦ sin_port — номер порта;

♦ sin_addr — структура, определяющая адрес узла;

♦ sin_zero — обычно не используется.

Структура struct in_addr, определяющая адрес узла, также описана в файле

in.h
:

struct in_addr {

 in_addr_t s_addr;

};

Обычно поле s_addr должно принимать значение INADDR_ANY — сейчас поясню почему. Структура sockaddr_in должна быть заполнена ДО вызова функции bind. Если поле sin_addr.s_addr принимает значение INADDR_ANY, то функция bind автоматически привяжет к сокету адрес локального компьютера и нам не нужно будет указывать его явно — так наша программа будет универсальной.

Функция bind возвращает 0 в случае успеха, и -1, если произошла ошибка. Вот небольшой пример использования этой функции:

struct sockaddr_in client;

...

client.sin_family = AF_INET;

client.sin_addr.s_addr = INADDR_ANY;

client.sin_port = 1235;

bind(sock, (struct sockaddr *)&client, sizeof(client));

27.3.3. Установление связи с удаленным компьютером

Устанавливать связь можно как на стороне сервера, так и на стороне клиента. На стороне клиента используется только один вызов — connect, который «спрашивает» у сервера: «Могу ли я подключиться?», то есть передает запрос на установление соединения. На сервере используются функции:

♦ listen — ожидание клиента;

♦ accept — подтверждение запроса клиента на установление соединения.

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

Функция listen

Вызов listen «заставляет» программу-сервер работать в режиме ожидания запроса на соединение от клиента. Прототип этой функции следующий:

#include <sys/socket.h>

extern int listen (int __fd, int __n) __THROW;

Первый параметр — это дескриптор сокета, а второй — максимальное количество запросов на установление связи (другими словами, максимальное количество клиентов).

Как и функция bind, функция listen в случае успеха возвращает 0. Пример вызова функции:

if (listen (sock1, 3) != 0) {

 printf("Ошибка при вызове listen(sock1, 3)\n");

 exit(1);

}

Функция connect

Используется программой-клиентом для отправки запроса на подключение к серверу. Прототип функции следующий:

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

extern int connect (int __fd, struct sockaddr_in *addr,

 socklen_t __len) __THROW;

Первый параметр — это дескриптор сокета, созданного функцией socket и привязанного функцией bind. Привязку сокета функцией bind выполнять не обязательно: если сокет не был привязан до вызова connect, привязка будет выполнена автоматически.

Второй параметр — это указатель на структуру типа sockaddr_in, содержащую информацию о сервере: его IP-адрес, номер порта, а также семейство протоколов.

Последний параметр — это размер структуры sockaddr_in в байтах. В случае успеха функция возвращает 0, а в случае ошибки —1.

Вот пример использования вызова connect:

struct sockaddr_in server;

struct hostent *h;

...

// определяем IP-адрес сервера

h = gethostbyname("server.domain.ru");

memcpy((char*)&server.sin_addr, h->h_addr, h->h_length);

// Определяем порт сервера

server.sin_port = 1234;

// Определяем семейство протоколов

server.sin_family = AF_INET;

// Вызов функции connect

connect(sock, &server, sizeof(server));

Если вы используете режим без установления соединения (SOCK_DGRAM), вызов connect необязателен.

Функция accept

Если максимальное число клиентов не превышено, сервер может принять запрос клиента. Для этого используется функция accept. Данная функция используется только при работе в режиме с установлением соединения. Прототип функции следующий:

#include <sys/socket.h>

#include <netinet/in.h>

extern int accept(int __fd, struct sockaddr_in *addr,

 socklen_t *__restrict __len) __THROW;

Первый параметр — это дескриптор сокета, второй — указатель на структуру, где можно разместить адрес клиента, причем данную структуру инициализировать не нужно. Последний параметр — размер структуры, указанной во втором параметре.

Системный вызов accept работает так. Сначала он извлекает из очереди listen запрос на соединение и создает новый сокет, через который будет производиться обмен данными с клиентом, например:

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

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Неучтенный

Муравьёв Константин Николаевич
1. Неучтенный
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
8.25
рейтинг книги
Неучтенный

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Переговоры

Форсайт Фредерик
Детективы:
политические детективы
5.75
рейтинг книги
Переговоры

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Гримуар темного лорда III

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Арбан Саеш. Трилогия

Малицкий Сергей Вацлавович
50. В одном томе
Фантастика:
фэнтези
8.17
рейтинг книги
Арбан Саеш. Трилогия

Газлайтер. Том 29

Володин Григорий Григорьевич
29. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
6.25
рейтинг книги
Газлайтер. Том 29

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Сара

Лерой Дж. Т.
Проза:
современная проза
контркультура
6.60
рейтинг книги
Сара

Сюжет

Синицын Олег Геннадьевич
Фантастика:
научная фантастика
5.75
рейтинг книги
Сюжет

Буря

Эренбург Илья Григорьевич
Проза:
военная проза
советская классическая проза
6.25
рейтинг книги
Буря