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

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

Жанры

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 запрос на соединение и создает новый сокет, через который будет производиться обмен данными с клиентом, например:

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

Эволюционер из трущоб. Том 12

Панарин Антон
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 12

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник

Мы – Гордые часть 8

Машуков Тимур
8. Стальные яйца
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мы – Гордые часть 8

Звездная Кровь. Изгой VII

Елисеев Алексей Станиславович
7. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
технофэнтези
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Изгой VII

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

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Моя простая курортная жизнь 3

Блум М.
3. Моя простая курортная жизнь
Юмор:
юмористическая проза
5.00
рейтинг книги
Моя простая курортная жизнь 3

Битва за Изнанку

Билик Дмитрий Александрович
7. Бедовый
Фантастика:
городское фэнтези
мистика
5.00
рейтинг книги
Битва за Изнанку

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ермак. Регент

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5