Сокет — это двунаправленный канал между двумя компьютерами в сети, который обеспечивает конечную точку соединения. «Двунаправленный» означает, что данный могут передаваться в двух направлениях — от клиента к серверу и наоборот. Понятие сокета — абстрактное, это как бы программный соединитель, через который обмениваются данными программа-сервер и программа-клиент.
Сокет-интерфейс используется для получения доступа к транспортному уровню протокола TCP/IP и представляет собой набор системных вызовов операционной системы и библиотечных функций на языке С. Все эти функции можно условно разделить на три группы:
♦ управляющие функции;
♦ функции установления связи;
♦ функции сетевого ввода/вывода.
Общий алгоритм работы сетевой программы, использующей сокеты:
1. Подготовить (создать) сокет — функция socket().
2. Связать сокет — функция bind().
3. Установить связь с удаленным компьютером (клиенту — установить связь, а серверу — ожидать установления связи).
4. Произвести обмен данными — функции recv() и send().
5. Завершить сеанс связи — close() и shutdown().
Библиотечные функции для работы с сокетами находятся в заголовочном файле sys/socket.h, поэтому для любой сетевой программы обязательна следующая директива:
#include
27.3.2. Создание и связывание сокета
Основная задача управляющих функций — организовать взаимодействие двух компьютеров, точнее процессов, а также завершить сеанс связи этих процессов. К управляющим функциям относятся функции:
♦ socket() — создание сокета;
♦ bind() — связывание сокета;
♦ close() и shutdown() — завершение сеанса связи.
Начнем по порядку, а именно, с функции socket(). Ее прототип следующий:
#include
#include
extern int socket(int __domain, int __type,
int __protocol) __THROW;
Первый аргумент определяет набор протоколов. Особо вдаваться в подробности не будем — просто всегда в качестве параметра domain передавайте значение AF_INET, что означает использование стека протоколов TCP/IP.
Аргумент type позволяет установить режим работы: с установлением соединения и без такового — значения SOCK_STREAM и SOCK_DGRAM соответственно. Для непосредственного доступа к протоколам IPv4 используется параметр SOCK_RAW. Для его использования нужно подключить заголовочный файл:
#include
Третий параметр лучше всего установить равным 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
#include
#include
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) \
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии