300 likes | 529 Views
Сокеты. Сетевой интерфейс прикладных программ (API). Службы, обеспечивающие интерфейс взаимодействия между приложениями и сетевыми протоколами. Приложение. Network API. Протокол A. Протокол B. Протокол C. Сокет. C окет – абстрактное представление конечной точки связи
E N D
Сетевой интерфейс прикладных программ(API) • Службы, обеспечивающие интерфейс взаимодействия между приложениями и сетевыми протоколами Приложение Network API Протокол A Протокол B Протокол C
Сокет • Cокет – абстрактное представление конечной точки связи • Сокеты служат для : • установления соединений • задания адресов конечных точек подключения
Дескрипторы сокетов Таблица дескрипторов Family: AF_INET Service: SOCK_STREAM Local IP: 111.22.3.4 Remote IP: 123.45.6.78 Local Port: 2249 Remote Port: 3726 0 1 2 3 4
Создание сокета int socket(intfamily,inttype,int proto); • familyуказывает семейство протоколов (AF_INET for TCP/IP). • typeуказывает тип сервиса (SOCK_STREAM, SOCK_DGRAM). • protocolзадает конкретный протокол (обычно 0, по умолчанию).
socket() • socket()возвращает дескриптор сокета или -1 при ошибке • socket()выделяет в системе ресурсы, необходимые конечной точке подключения
Адрес конечной точки • Для TCP/IP необходимо задание IP-адреса и номера порта • Другие протоколы могут использовать другие методы адресации
Универсальная структура адреса structsockaddr { uint8_t sa_len; sa_family_tsa_family; char sa_data[14]; }; • sa_familyуказывает тип адреса. • sa_dataсодержит значение адреса
struct sockaddr_in (IPv4) structsockaddr_in { uint8_t sin_len; sa_family_tsin_family; in_port_tsin_port; structin_addrsin_addr; char sin_zero[8]; };
structsockaddr_in6 (IPv6) struct sockaddr_in6 { uint8_t sin6_len; sa_family_tsin6_family; in_port_tsin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; };
Сетевой порядок байтов • Значения, сохраняемые в структуре sockaddr_inдолжны иметь сетевой порядок байтов: • sin_portномер порта • sin_addr IP-адрес
Преобразование порядка байтов ‘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);
Присвоение адреса сокету • Функцияbind()используется для присвоения адреса сокету int bind(intsockfd, const structsockaddr *myaddr, intaddrlen); • bindвозвращает 0 при успехе или -1 при ошибке
bind() • Вызов bind()назначает адрес, заданный в структуре sockaddr,дескриптору сокета • Указатель на структуру адреса должен быть преобразован к указателю на универсальную структуру. Netprog: Sockets API
Преобразование адресов IPv4 intinet_aton( char *, structin_addr *); Преобразует адрес из текстового вида в 32-битное значение в сетевом порядке байтов. char *inet_ntoa(structin_addr); Преобразует адрес из 32-битного числа в текстовую строку Netprog: Sockets API
Подключение к серверу • Функцияconnect()используется для подключения к серверу int connect(intsockfd, const structsockaddr *serv_addr, socklen_taddrlen);
connect() • connect() используется клиентом для установки соединения при использовании надежного протокола TCP • параметр sockaddr задает структуру адреса сервера
Переход сокета в состояние LISTEN • Функцияlisten()используется для перевода сокета в состояние LISTEN (готовность к приему входящих подключений) int listen(intsockfd, int backlog);
listen() • запросы на подключение к сокету начинают приниматься системой • аргумент backlog задает максимальную длину очереди входящих соединений.
Согласие на обслуживание соединения • Функцияaccept()используется для выбора следующего клиента из очереди установленных соединений int accept(intsockd, structsockaddr *cliaddr, socklen_t *addrlen);
accept() • Если очередь соединений пуста, процесс переходит в состояние ожидания • Параметр cliaddrслужит для получения адреса клиента, clilen – длина структуры адреса
Обмен данными • Функцииsend() и recv()используются для передачи и приема данных соответственно int send(int socket, const void *msg, size_tlen, int flags); intrecv(int socket, void *buf, size_tlen, int flags);
send() • cлужит для отправки сообщения • msg – адрес передаваемого сообщения • len– длина передаваемого сообщения • flags– дополнительные параметры (обычно 0)
recv() • служит для приема сообщения • msg – адрес буфера приема • len– максимальное количество принимаемых байт • flags– дополнительные параметры (обычно 0)
Закрытие сокета • Функцииclose() (UNIX) или closesocket() (Windows)используются для корректного завершения TCP-соединения int close(intsockfd); intclosesocket(intsd);