Сокеты
DESCRIPTION
Сокеты. Сетевой интерфейс прикладных программ (API). Службы, обеспечивающие интерфейс взаимодействия между приложениями и сетевыми протоколами. Приложение. Network API. Протокол A. Протокол B. Протокол C. Сокет. C окет – абстрактное представление конечной точки связи - PowerPoint PPT PresentationTRANSCRIPT
1
СокетыСокеты
2
Сетевой интерфейс Сетевой интерфейс прикладных программприкладных программ(API)(API)
• Службы, обеспечивающие интерфейс Службы, обеспечивающие интерфейс взаимодействия между приложениями и взаимодействия между приложениями и сетевыми протоколамисетевыми протоколами
ПриложениеПриложение
Network APINetwork API
Протокол Протокол AA Протокол Протокол BB Протокол Протокол CC
3
СокетСокет
• CCокет – абстрактное представление окет – абстрактное представление конечной точки связиконечной точки связи
• Сокеты служат для Сокеты служат для ::– установления соединенийустановления соединений– задания адресов конечных точек задания адресов конечных точек
подключенияподключения
4
Дескрипторы сокетовДескрипторы сокетовТаблица дескрипторовТаблица дескрипторов
0
1
2
3
4
Family: AF_INETFamily: AF_INETService: SOCK_STREAMService: SOCK_STREAMLocal IP: 111.22.3.4Local IP: 111.22.3.4Remote IP: 123.45.6.78Remote IP: 123.45.6.78Local Port: 2249Local Port: 2249Remote Port: 3726Remote Port: 3726
Family: AF_INETFamily: AF_INETService: SOCK_STREAMService: SOCK_STREAMLocal IP: 111.22.3.4Local IP: 111.22.3.4Remote IP: 123.45.6.78Remote IP: 123.45.6.78Local Port: 2249Local Port: 2249Remote Port: 3726Remote Port: 3726
5
Создание сокетаСоздание сокета
int socket(int family,int type,int proto);int socket(int family,int type,int proto);
• familyfamily указывает семейство указывает семейство протоколов протоколов ((AF_INETAF_INET for TCP/IP). for TCP/IP).
• typetype указывает тип сервисауказывает тип сервиса ((SOCK_STREAMSOCK_STREAM, , SOCK_DGRAMSOCK_DGRAM).).
• protocolprotocol задает конкретный протокол задает конкретный протокол ((обычнообычно 0 0, по умолчанию, по умолчанию).).
6
socket()socket()
• socket()socket() возвращает дескриптор возвращает дескриптор сокета илисокета или -1 -1 при ошибкепри ошибке
• socket()socket() выделяет в системе выделяет в системе ресурсы, необходимые конечной ресурсы, необходимые конечной точке подключенияточке подключения
7
Адрес конечной точкиАдрес конечной точки
• Для Для TCP/IP TCP/IP необходимо задание необходимо задание IP-IP-адреса и номера портаадреса и номера порта
• Другие протоколы могут использовать Другие протоколы могут использовать другие методы адресациидругие методы адресации
8
Универсальная структура Универсальная структура адресаадреса
struct sockaddr {struct sockaddr {
uint8_tuint8_t sa_len;sa_len;
sa_family_tsa_family_t sa_family; sa_family;
charchar sa_data[14];sa_data[14];
};};
• sa_familysa_family указывает тип адресауказывает тип адреса..• sa_datasa_data содержит значение адресасодержит значение адреса
9
struct sockaddr_in (IPv4)struct sockaddr_in (IPv4)
struct sockaddr_in {struct sockaddr_in {
uint8_tuint8_t sin_len;sin_len;
sa_family_tsa_family_t sin_family;sin_family;
in_port_tin_port_t sin_port;sin_port;
struct in_addrstruct in_addr sin_addr; sin_addr;
charchar sin_zero[8];sin_zero[8];
};};
10
struct sockaddr_instruct sockaddr_in66 (IPv (IPv66))
struct sockaddr_in6 {struct sockaddr_in6 {
uint8_t uint8_t sin6_len; sin6_len;
sa_family_t sa_family_t sin6_family;sin6_family;
in_port_tin_port_t sin6_port; sin6_port;
uint32_tuint32_t sin6_flowinfo; sin6_flowinfo;
struct in6_addr sin6_addr; struct in6_addr sin6_addr;
uint32_tuint32_t sin6_scope_id; sin6_scope_id;
};};
11
Сетевой порядок байтовСетевой порядок байтов
• Значения, сохраняемые в структуре Значения, сохраняемые в структуре sockaddr_insockaddr_in должны иметь должны иметь сетевой порядок байтов:сетевой порядок байтов:– sin_portsin_port номер портаномер порта– sin_addrsin_addr IP- IP-адресадрес
12
Преобразование порядка байтовПреобразование порядка байтов
‘‘hh’ : ’ : порядок байтов хоста порядок байтов хоста
‘‘nn’ : ’ : сетевой порядок байтовсетевой порядок байтов
‘‘ss’ : short (16bit) ‘’ : short (16bit) ‘ll’ : long (32bit)’ : long (32bit)
uint16_t uint16_t hhtotonnss(uint16_t);(uint16_t); uint16_t uint16_t nntotohhss(uint_16_t);(uint_16_t);
uint32_t uint32_t hhtotonnll(uint32_t);(uint32_t);uint32_t uint32_t nntotohhll(uint32_t);(uint32_t);
13
Присвоение адреса сокетуПрисвоение адреса сокету
• ФункцияФункция bind()bind() используется для используется для присвоения адреса сокетуприсвоения адреса сокету
int bind(int sockfd, int bind(int sockfd, const struct sockaddr const struct sockaddr
*myaddr, *myaddr, int addrlen);int addrlen);
• bindbind возвращаетвозвращает 0 0 при успехе илипри успехе или -1 -1 при при ошибкеошибке
14Netprog: Sockets API
bind()bind()
• Вызов Вызов bind()bind()назначает адрес, назначает адрес, заданный в структуре заданный в структуре sockaddrsockaddr,, дескриптору сокетадескриптору сокета
• Указатель на структуру адреса должен Указатель на структуру адреса должен быть преобразован к указателю на быть преобразован к указателю на универсальную структуру.универсальную структуру.
15Netprog: Sockets API
Преобразование адресов Преобразование адресов IPv4IPv4int inet_aton( char *, struct in_addr *);int inet_aton( char *, struct in_addr *);
Преобразует адрес из текстового вида Преобразует адрес из текстового вида в 32-битное значение в сетевом в 32-битное значение в сетевом порядке байтовпорядке байтов..
char *inet_ntoa(struct in_addr);char *inet_ntoa(struct in_addr);
Преобразует адрес из 32-битного числа Преобразует адрес из 32-битного числа в текстовую строкув текстовую строку
16
Подключение к серверуПодключение к серверу
• ФункцияФункция connect()connect() используется для используется для подключения к серверуподключения к серверу
int connect(int sockfd, int connect(int sockfd,
const struct sockaddr const struct sockaddr *serv_addr, *serv_addr, socklen_t addrlen); socklen_t addrlen);
17
connect()connect()
• connect() connect() используется клиентом для используется клиентом для установки соединения при использовании установки соединения при использовании надежного протокола надежного протокола TCPTCP
• параметр параметр sockaddrsockaddr задает структуру задает структуру адреса сервера адреса сервера
18
Переход сокета в состояние Переход сокета в состояние LISTENLISTEN
• ФункцияФункция listen()listen() используется для используется для перевода сокета в состояние перевода сокета в состояние LISTEN LISTEN ((готовность к приему входящих готовность к приему входящих подключений)подключений)
int listen(int sockfd, int backlog);int listen(int sockfd, int backlog);
19
listen()listen()
• запросы на подключение к сокету запросы на подключение к сокету начинают приниматься системойначинают приниматься системой
• аргумент аргумент backlog backlog задает максимальную задает максимальную длину очереди входящих соединений. длину очереди входящих соединений.
20
Согласие на обслуживание Согласие на обслуживание соединениясоединения
• ФункцияФункция accept()accept() используется для используется для выбора следующего клиента из очереди выбора следующего клиента из очереди установленных соединенийустановленных соединений
int accept(int sockd, int accept(int sockd,
struct sockaddr struct sockaddr *cliaddr, *cliaddr,
socklensocklen__tt * *addrlenaddrlen););
21
accept()accept()
• Если очередь соединений пуста, процесс Если очередь соединений пуста, процесс переходит в состояние ожиданияпереходит в состояние ожидания
• Параметр Параметр cliaddr cliaddr служит для получения служит для получения адреса клиента, адреса клиента, clilen – clilen – длина структуры длина структуры адресаадреса
22
Обмен даннымиОбмен данными
• ФункцииФункции send()send() и и recv()recv() используются для используются для передачи и приема данных соответственнопередачи и приема данных соответственно
int send(int socket, const void *msg, int send(int socket, const void *msg, size_t len, int flags);size_t len, int flags);
int recv(int socket, void *buf, int recv(int socket, void *buf, size_t len, int size_t len, int
flags);flags);
23
send()send()
• ccлужит для отправки сообщениялужит для отправки сообщения• msg – msg – адрес передаваемого сообщенияадрес передаваемого сообщения• lenlen – длина передаваемого сообщения– длина передаваемого сообщения• flagsflags – дополнительные параметры – дополнительные параметры
(обычно 0)(обычно 0)
24
recv()recv()
• служит для приема сообщенияслужит для приема сообщения• msg – msg – адрес буфера приемаадрес буфера приема• lenlen – максимальное количество – максимальное количество
принимаемых байтпринимаемых байт• flagsflags – дополнительные параметры – дополнительные параметры
(обычно 0)(обычно 0)
25
Закрытие сокетаЗакрытие сокета
• ФункцииФункции close()close() ( (UNIX)UNIX) или или closesocket() closesocket() (Windows)(Windows) используются для корректного используются для корректного завершения завершения TCP-TCP-соединениясоединения
int close(int sockfd);int close(int sockfd);
int closesocket(int sd);int closesocket(int sd);