Сетевые сокеты
.pdf
Обмен данными
● Двунаправленный обмен данными
#include <sys/socket.h>
int shutdown(int sockfd, int how);
●SHUT_RD
●SHUT_WR
●SHUT_RDWR
Сторона сервера
У каждого сокета должен быть адрес (как у клиента так и у сервера)
Дла сокетов в домене AF_INET (IPv4) адрес:
[ip_adress] + [port] |
8.8.8.8:53 |
Связка сокета с адресом
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);
Возвращает 0 в случае успеха, –1 в случае ошибки
Ограничения
●Указываемый адрес должен быть действительным адресом для машины, на которой выполняется процесс – мы не можем задать адрес, который принадлежит другой машине.
●Формат адреса должен совпадать с форматом, который поддерживается семейством адресов, указанным при создании сокета.
●Номер порта не может быть меньше 1024, если процесс не имеет соответствующих привилегий (например, привилегий суперпользователя).
●Обычно каждый конкретный адрес может быть связан только с одним сокетом
Задание адреса
Для каждого домена определен свой формат представления адреса. AF_INET:
struct in_addr {
in_addr_t s_addr; /* адрес IPv4 */
};
struct sockaddr_in {
sa_family_t sin_family; /* семейство адресов */ in_port_t sin_port; /* номер порта */ struct in_addr sin_addr; /* адрес IPv4 */
};
Преобразование адресов
include <arpa/inet.h>
Преобразование текстового адреса в числовой int inet_pton(int af, const char *src, void *dst);
Обратное преобразование
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Пример
inet_pton.c
Преобразование портов
#include <arpa/inet.h>
uint16_t htons(uint16_t hostint16);
Возвращает 16-битное целое с сетевым порядком байтов
Обратное преобразование
#include <arpa/inet.h>
uint16_t ntohs(uint16_t netint16);
Возвращает 16 битное целое с аппаратным порядком байтов
Прослушивание всех сетевых интерфейсов
Специальный адрес: INADDR_ANY
