Сокеты 1 Сетевой интерфейс прикладных программ(API) • Службы, обеспечивающие интерфейс взаимодействия между приложениями и сетевыми протоколами Приложение Network API Протокол A Протокол B Протокол C 2 Сокет • Cокет – абстрактное представление конечной точки связи • Сокеты служат для : – установления соединений – задания адресов конечных точек подключения 3 Дескрипторы сокетов Таблица дескрипторов 0 1 2 3 Family: AF_INET Service: SOCK_STREAM Local IP: 111.22.3.4 Remote IP: 123.45.6.78 Local Port: 2249 Remote Port: 3726 4 4 Создание сокета int socket(int family,int type,int proto); • family указывает семейство протоколов (AF_INET for TCP/IP). • type указывает тип сервиса (SOCK_STREAM, SOCK_DGRAM). • protocol задает конкретный протокол (обычно 0, по умолчанию). 5 socket() • socket() возвращает дескриптор сокета или -1 при ошибке • socket() выделяет в системе ресурсы, необходимые конечной точке подключения 6 Адрес конечной точки • Для TCP/IP необходимо задание IPадреса и номера порта • Другие протоколы могут использовать другие методы адресации 7 Универсальная структура адреса struct sockaddr uint8_t sa_family_t char }; { sa_len; sa_family; sa_data[14]; • sa_family указывает тип адреса. • sa_data содержит значение адреса 8 struct sockaddr_in (IPv4) struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; 9 struct sockaddr_in6 (IPv6) struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; }; 10 Сетевой порядок байтов • Значения, сохраняемые в структуре sockaddr_in должны иметь сетевой порядок байтов: – sin_port – sin_addr номер порта IP-адрес 11 Преобразование порядка байтов ‘h’ : порядок байтов хоста ‘n’ : сетевой порядок байтов ‘s’ : short (16bit) ‘l’ : long (32bit) uint16_t htons(uint16_t); uint16_t ntohs(uint_16_t); uint32_t htonl(uint32_t); uint32_t ntohl(uint32_t); 12 Присвоение адреса сокету • Функция bind() используется присвоения адреса сокету для int bind(int sockfd, const struct sockaddr *myaddr, int addrlen); • bind возвращает 0 при успехе или -1 при ошибке 13 bind() • Вызов bind()назначает адрес, заданный в структуре sockaddr, дескриптору сокета • Указатель на структуру адреса должен быть преобразован к указателю на универсальную структуру. Netprog: Sockets API 14 Преобразование адресов IPv4 int inet_aton( char *, struct in_addr *); Преобразует адрес из текстового вида в 32-битное значение в сетевом порядке байтов. char *inet_ntoa(struct in_addr); Преобразует адрес из 32-битного числа в текстовую строку Netprog: Sockets API 15 Подключение к серверу • Функция connect() используется для подключения к серверу int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); 16 connect() • connect() используется клиентом для установки соединения при использовании надежного протокола TCP • параметр sockaddr задает структуру адреса сервера 17 Переход сокета в состояние LISTEN • Функция listen() используется для перевода сокета в состояние LISTEN (готовность к приему входящих подключений) int listen(int sockfd, int backlog); 18 listen() • запросы на подключение к начинают приниматься системой сокету • аргумент backlog задает максимальную длину очереди входящих соединений. 19 Согласие на обслуживание соединения • Функция accept() используется для выбора следующего клиента из очереди установленных соединений int accept(int sockd, struct sockaddr *cliaddr, socklen_t *addrlen); 20 accept() • Если очередь соединений пуста, процесс переходит в состояние ожидания • Параметр cliaddr служит для получения адреса клиента, clilen – длина структуры адреса 21 Обмен данными • Функции send() и recv() используются для передачи и приема данных соответственно int send(int socket, const void *msg, size_t len, int flags); int recv(int socket, void *buf, size_t len, int flags); 22 send() • cлужит для отправки сообщения • msg – адрес передаваемого сообщения • len – длина передаваемого сообщения • flags – дополнительные параметры (обычно 0) 23 recv() • служит для приема сообщения • msg – адрес буфера приема • len – максимальное количество принимаемых байт • flags – дополнительные параметры (обычно 0) 24 Закрытие сокета • Функции close() (UNIX) или closesocket() (Windows) используются для корректного завершения TCP-соединения int close(int sockfd); int closesocket(int sd); 25