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

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

Жанры

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

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

Шрифт:

2. Связать сокет — функция bind.

3. Установить связь с удаленным компьютером (клиенту — установить связь, а серверу — ожидать установления связи).

4. Произвести обмен данными — функции recv и send.

5. Завершить сеанс связи — close и shutdown.

Библиотечные функции для работы с сокетами находятся в заголовочном файле sys/socket.h, поэтому для любой сетевой программы обязательна следующая директива:

#include <sys/socket.h>

27.3.2. Создание и связывание сокета

Основная

задача управляющих функций — организовать взаимодействие двух компьютеров, точнее процессов, а также завершить сеанс связи этих процессов. К управляющим функциям относятся функции:

♦ socket — создание сокета;

♦ bind — связывание сокета;

♦ close и shutdown — завершение сеанса связи.

Начнем по порядку, а именно, с функции socket. Ее прототип следующий:

#include <sys/types.h>

#include <sys/socket.h>

extern int socket(int __domain, int __type,

 int __protocol) __THROW;

Первый аргумент определяет набор протоколов. Особо вдаваться в подробности не будем — просто всегда в качестве параметра domain передавайте значение AF_INET, что означает использование стека протоколов TCP/IP.

Аргумент type позволяет установить режим работы: с установлением соединения и без такового — значения SOCK_STREAM и SOCK_DGRAM соответственно. Для непосредственного доступа к протоколам IPv4 используется параметр SOCK_RAW. Для его использования нужно подключить заголовочный файл:

#include <netinet/in.h>

Третий параметр лучше всего установить равным 0. В этом случае будет выбран протокол по умолчанию в зависимости от режима работы:

TCP, если мы выбрали режим SOCK_STREAM;

UDP, если мы выбрали SOCK_DGRAM.

Если вы установили значение SOCK_RAW, вы можете указывать в качестве последнего параметра непосредственно значения из файла

/etc/protocols
. Фрагмент этого файла приведен ниже.

Листинг 27.2. Фрагмент файла /etc/protocols

ip 0 IP # Протокол Интернета

icmp 1 ICMP # Протокол ICMP

igmp 2 IGMP # Протокол IGMP

# (Internet Group Management Protocol)

ggp 3 GGP # Протокол GGP (gateway-gateway )

tcp 6 TCP # Протокол TCP

udp 17 UDP # Протокол UDP

Если сокет создан успешно, функция возвращает дескриптор сокета — целое положительное число. В случае ошибки функция возвращает значение -1 (отрицательное число). Вот небольшой пример:

int sock;

sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock==-1) {

 printf("Ошибка при создании сокета\n");

 exit(1);

}

Чтобы

связать созданный нами сокет с локальным портом, например, 1234, нужно использовать системный вызов bind:

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

extern int bind(int fd, struct sockaddr *addr,

 socklen_t len) __THROW;

Первый аргумент функции задает дескриптор нашего сокета. Второй — это указатель на структуру типа sockaddr. Все структуры данного типа определены в файле

socket.h
:

# define __SОСKADDR_ALLTYPES \

 __SOCKADDR_ONETYPE (sockaddr) \

 __SOCKADDR_ONETYPE (sockaddr_at) \

 __SОСKADDR_ONETYPE (sockaddr_ax25) \

 __SOCKADDR_ONETYPE (sockaddr_dl) \

 __SOCKADDR_ONETYPE (sockaddr_eon) \

 __SОСKADDR_ONETYPE (sockaddr_in) \

 __SOCKADDR_ONETYPE (sockaddr_in6) \

 __SОСKADDR_ONETYPE (sockaddr_inarp) \

 __SOCKADDR_ONETYРЕ (sockaddr_ipx) \

 __SОСKADDR_ONETYPE (sockaddr_iso) \

 __SОСKADDR_ONETYPE (sockaddr_ns) \

 __SOCKADDR_ONETYPE (sockaddr_un) \

 __SOCKADDR_ONETYPE (sockaddr_x25)

Мы программируем для сети TCP/IP, поэтому будем использовать структуру sockaddr_in (для IPv4) или sockaddr_in6 (для IPv6).

Последний аргумент — это длина выбранной нами структуры (sockaddr_in) в байтах.

Структура sockaddr_in определена в файле

in.h
так:

struct sockaddr_in {

 __SОСKADDR_COMMON(sin_);

 in_port_t sin_port; /* Номер порта */

 struct in_addr sin_addr; /* IP-адрес */

 unsigned char sin_zero[sizeof (struct sockaddr) -

__SОСKADDR_COMMON_SIZE -

sizeof(in_port_t) - sizeof (struct in_addr)];

};

/* для IPv6. */

struct sockaddr_in6 {

 __SОСKADDR_COMMON(sin6_);

 in_port_t sin6_port; /* Порт транспортного уровня */

 uint32_t sin6_flowinfo; /* Информация потока IPv6 */

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

Инцел на службе демоницы 1 и 2: Секса будет много

Блум М.
Инцел на службе демоницы
Фантастика:
фэнтези
5.25
рейтинг книги
Инцел на службе демоницы 1 и 2: Секса будет много

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Агеева Елена А.
Документальная литература:
публицистика
5.40
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Треугольная шляпа. Пепита Хименес. Донья Перфекта. Кровь и песок.

Бласко Висенте Ибаньес
65. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Треугольная шляпа.
Пепита Хименес.
Донья Перфекта.
Кровь и песок.

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21