Інтерфейс сокетів та його застосування при програмуванні мережних задач. Типи сокетів та сімейства адрес
Интерфейс сокетов - это API для сетевых приложений. Он представляет собой набор функций, позволяющих разрабатывать сетевые приложения с использованием различных сетевых протоколов. Первоначально, сокеты были реализованы (встроены) в ОС UNIX (BSD UNIX) для поддержки протоколов TCP/IP. Есть поддержка сокетов в Windows в dll-библиотеки WinSock.
Назначение:
- кросс-платформенный интерфейс для программирования коммутационных задач;
Возможности:
- создание сокетов;
- подключение к портам;
- установка подключения;
- передача данных;
- закрытие сеанса;
- преобразование адреса и данных;
Сокет - это абстрактный объект, обозначающий конечную точку сетевого соединения. Для установления соединений необходимо, чтобы каждая из сетевых программ имела свой собственный сокет, т.е., его нужно открыть(создать) на обеих концах сетевого соединения. Сокеты могут использоваться для обмена данными как с установлением соединений (каналы, потоки, сессии) так и без установления соединений(датаграмы0).
Структуры:
sockaddr — обобщённая структура адреса, к которой, в зависимости от используемого семейства протоколов, приводится соответствующая структура, например:
− sockaddr_in
− sockaddr_in6
− in_addr
− in6_addr
struct sockaddr { unsigned short sa_family; // Семейство адресов, AF_xxx char sa_data[14]; // 14 байтов для хранения адреса}; |
Поле sa_family содержит идентификатор домена, тот же, что и первый параметр функции socket. В зависимости от значения этого поля по-разному интерпретируется содержимое массива sa_data. Разумеется, работать с этим массивом напрямую не очень удобно, поэтому вы можете использовать вместо sockaddr одну из альтернативных структур вида sockaddr_XX (XX - суффикс, обозначающий домен: "un" - Unix, "in" - Internet и т. д.). При передаче в функцию bind указатель на эту структуру приводится к указателю на sockaddr. Рассмотрим для примера структуру sockaddr_in.
struct sockaddr_in { short int sin_family; // Семейство адресов unsigned short int sin_port; // Номер порта struct in_addr sin_addr; // IP-адрес unsigned char sin_zero[8]; // "Дополнение" до размера структуры sockaddr}; |
Здесь поле sin_family соответствует полю sa_family в sockaddr, в sin_port записывается номер порта, а в sin_addr - IP-адрес хоста. Поле sin_addr само является структурой, которая имеет вид:
struct in_addr { unsigned long s_addr;}; |
Типы сокетов:
− SOCK_STREAM (надежная потокоориентированная служба (сервис) или потоковый сокет)
− SOCK_DGRAM (служба датаграмм или датаграммный сокет)
− SOCK_SEQPACKET (надежная служба последовательных пакетов) или
− SOCK_RAW (сырой протокол поверх сетевого уровня).
Семейство протоколов:
− PF_INET для сетевого протокола IPv4 или
− PF_INET6 для IPv6.
− PF_UNIX для локальных сокетов (используя файл).