Сокеты

advertisement
Сокеты
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
Download