Сокеты

25
1 Сокеты Сокеты

Upload: austin-cooper

Post on 01-Jan-2016

49 views

Category:

Documents


0 download

DESCRIPTION

Сокеты. Сетевой интерфейс прикладных программ (API). Службы, обеспечивающие интерфейс взаимодействия между приложениями и сетевыми протоколами. Приложение. Network API. Протокол A. Протокол B. Протокол C. Сокет. C окет – абстрактное представление конечной точки связи - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Сокеты

1

СокетыСокеты

Page 2: Сокеты

2

Сетевой интерфейс Сетевой интерфейс прикладных программприкладных программ(API)(API)

• Службы, обеспечивающие интерфейс Службы, обеспечивающие интерфейс взаимодействия между приложениями и взаимодействия между приложениями и сетевыми протоколамисетевыми протоколами

ПриложениеПриложение

Network APINetwork API

Протокол Протокол AA Протокол Протокол BB Протокол Протокол CC

Page 3: Сокеты

3

СокетСокет

• CCокет – абстрактное представление окет – абстрактное представление конечной точки связиконечной точки связи

• Сокеты служат для Сокеты служат для ::– установления соединенийустановления соединений– задания адресов конечных точек задания адресов конечных точек

подключенияподключения

Page 4: Сокеты

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

Page 5: Сокеты

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, по умолчанию, по умолчанию).).

Page 6: Сокеты

6

socket()socket()

• socket()socket() возвращает дескриптор возвращает дескриптор сокета илисокета или -1 -1 при ошибкепри ошибке

• socket()socket() выделяет в системе выделяет в системе ресурсы, необходимые конечной ресурсы, необходимые конечной точке подключенияточке подключения

Page 7: Сокеты

7

Адрес конечной точкиАдрес конечной точки

• Для Для TCP/IP TCP/IP необходимо задание необходимо задание IP-IP-адреса и номера портаадреса и номера порта

• Другие протоколы могут использовать Другие протоколы могут использовать другие методы адресациидругие методы адресации

Page 8: Сокеты

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 содержит значение адресасодержит значение адреса

Page 9: Сокеты

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];

};};

Page 10: Сокеты

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;

};};

Page 11: Сокеты

11

Сетевой порядок байтовСетевой порядок байтов

• Значения, сохраняемые в структуре Значения, сохраняемые в структуре sockaddr_insockaddr_in должны иметь должны иметь сетевой порядок байтов:сетевой порядок байтов:– sin_portsin_port номер портаномер порта– sin_addrsin_addr IP- IP-адресадрес

Page 12: Сокеты

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);

Page 13: Сокеты

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 при при ошибкеошибке

Page 14: Сокеты

14Netprog: Sockets API

bind()bind()

• Вызов Вызов bind()bind()назначает адрес, назначает адрес, заданный в структуре заданный в структуре sockaddrsockaddr,, дескриптору сокетадескриптору сокета

• Указатель на структуру адреса должен Указатель на структуру адреса должен быть преобразован к указателю на быть преобразован к указателю на универсальную структуру.универсальную структуру.

Page 15: Сокеты

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-битного числа в текстовую строкув текстовую строку

Page 16: Сокеты

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);

Page 17: Сокеты

17

connect()connect()

• connect() connect() используется клиентом для используется клиентом для установки соединения при использовании установки соединения при использовании надежного протокола надежного протокола TCPTCP

• параметр параметр sockaddrsockaddr задает структуру задает структуру адреса сервера адреса сервера

Page 18: Сокеты

18

Переход сокета в состояние Переход сокета в состояние LISTENLISTEN

• ФункцияФункция listen()listen() используется для используется для перевода сокета в состояние перевода сокета в состояние LISTEN LISTEN ((готовность к приему входящих готовность к приему входящих подключений)подключений)

int listen(int sockfd, int backlog);int listen(int sockfd, int backlog);

Page 19: Сокеты

19

listen()listen()

• запросы на подключение к сокету запросы на подключение к сокету начинают приниматься системойначинают приниматься системой

• аргумент аргумент backlog backlog задает максимальную задает максимальную длину очереди входящих соединений. длину очереди входящих соединений.

Page 20: Сокеты

20

Согласие на обслуживание Согласие на обслуживание соединениясоединения

• ФункцияФункция accept()accept() используется для используется для выбора следующего клиента из очереди выбора следующего клиента из очереди установленных соединенийустановленных соединений

int accept(int sockd, int accept(int sockd,

struct sockaddr struct sockaddr *cliaddr, *cliaddr,

socklensocklen__tt * *addrlenaddrlen););

Page 21: Сокеты

21

accept()accept()

• Если очередь соединений пуста, процесс Если очередь соединений пуста, процесс переходит в состояние ожиданияпереходит в состояние ожидания

• Параметр Параметр cliaddr cliaddr служит для получения служит для получения адреса клиента, адреса клиента, clilen – clilen – длина структуры длина структуры адресаадреса

Page 22: Сокеты

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);

Page 23: Сокеты

23

send()send()

• ccлужит для отправки сообщениялужит для отправки сообщения• msg – msg – адрес передаваемого сообщенияадрес передаваемого сообщения• lenlen – длина передаваемого сообщения– длина передаваемого сообщения• flagsflags – дополнительные параметры – дополнительные параметры

(обычно 0)(обычно 0)

Page 24: Сокеты

24

recv()recv()

• служит для приема сообщенияслужит для приема сообщения• msg – msg – адрес буфера приемаадрес буфера приема• lenlen – максимальное количество – максимальное количество

принимаемых байтпринимаемых байт• flagsflags – дополнительные параметры – дополнительные параметры

(обычно 0)(обычно 0)

Page 25: Сокеты

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);