
Интерфейс сокетов.ppt
- Количество слайдов: 25
Интерфейс сокетов
Литература ¡ ¡ ¡ К. Джамса, К. Коул Программирование для Интернет в среде Windows В. Стоулинг Беспроводные линии связи и сети М. Кульгин Технологии корпоративных сетей Фролов А. В. , Фролов Г. В. Разработка приложений для Интернет Мэтью Ногл TCP/IP
Создание сокета Socket. handle = socket( protocol_family, socket_type, protocol); ¡ ¡ ¡ Семейство протоколов - Protocol_family PF_INET - протоколы TCP/IP. PF_NS- протоколы Ксерокс XNS. PF_UNIX - протоколы внутренние Unix. AF_INET - Семейство адресов для Internet позволяет пользоваться разными семействами адресов внутри одного семейства протоколов. На сегодняшний день семейство адресов AF_INET и семейство протоколов PF_INET имеют одинаковое значение.
Создание сокета Тип соединения - Socket_type ¡ ¡ SOCK_STREAM - ориентированный на соединение тип предназначен для перемещения потока байтов SOCK_DGRAM - не ориентированный на соединение предназначен для перемещения датаграмм Протокол - Protocol ¡ IPPROTO_TCP, IPPROTO_UDP - Семейство протоколов TCP/IP состоит из нескольких протоколов IP, ICMP, TCP, UDP. Константы shandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Дескриптор сокета ¡ Дескриптор – это указатель на структуру данных сокета. Дескриптор хранится в таблице дескрипторов. Таблица дескрипторов … Указатель на структуру … … Структура данных сокета Семейство протоколов Тип сервиса Локальный IP – адрес Удаленный IP – адрес Локальный порт протокола TCP Удаленный порт протокола TCP
Функции сокета bind() Присваивает имя новому сокету listen() Переводит сокет в состояние прослушивания accept() Блокирует сокет. Образует новый сокет и соединяет его с удаленным сетевым компьютером. connect() Блокирует сокет. Устанавливает соединение на указанном сокете select() Блокирует сокет. Выполняет мультиплексирование при наблюдении за состоянием нескольких сокетов getpeername() Получает имя удаленного процесса, связанного с сокетом getsockname() Возвращает имя лакального сокета getsockopt() Возвращает статус (опции) указанного сокета
Функции сокета recv() Блокирует сокет. Принимает данные из соединенного сокета recvfrom() Блокирует сокет. Принимает данные из соединенного сокета send() Блокирует сокет. Передает данные через соединенный сокет sendto() Блокирует сокет. Передает данные через не соединенный сокет shutdown() Закрывает одну сторону дуплексного соединения closesocket() Блокирует сокет. Закрывает одну сторону соединения сокетов
Сетевой порядок байтов ¡ ¡ Компьютеры имеют разный порядок хранения байтов. Этот порядок байтов хоста. Порядок «с начала» - более значимые байты хранится в ячейке с младшим адресом. Противоречит способу написания чисел. Порядок «с конца» - более значимые байты хранятся в старших адресах. Применяется при письме на многих языках. Споры по поводу, какой порядок байтов лучше не дали результата. Платформа С начала С конца Intel 80 x 86 X DEC VAX PDP X Motorola 68000 X IBM 370 X
Порядок байтов хоста С начала Числ о 12 34 56 78 90 AB CD EF Адре 1001 1002 1003 1004 1005 1006 1007 1008 С конца с Числ 78 56 34 12 EF CD AB 90 о Адре с 1001 1002 1003 1004 1005 1006 1007 1008 В Internet принят сетевой порядок байтов «с начала» . Если эти данные числовые, то программа должна преобразовать их порядок. Winsock предоставляет функции преобразования данных
Функции сокета для преобразования чисел htonl() Преобразует порядок байтов 32 -разрядного числа из машинного (порядок хоста) в сетевой htons() Преобразует порядок байтов 16 -разрядного числа из машинного (порядок хоста) в сетевой inet_addr() Преобразует строку с IP-адресом в виде десяточного с точкой в 32 -разрядное число с сетевым порядком байтов inet_ntoa() Преобразует I-адрес из 32 -разрядного числа в десятичное с точкой ntohl() Преобразует порядок байтов 32 -разрядного числа из сетевого в машинный (порядок хоста) ntohs() Преобразует порядок байтов 16 -разрядного числа из сетевого в машинный (порядок хоста)
Структура адреса сокета struct sockaddr_in { short sin_family; //семейство адресов AF_INET u_short sin_port; //порт struct in_addr sin_addr; //IP адрес char sin_zero[8]; };
Структура адреса сокета struct in_addr { union { struct {u_char s_b 1, s_b 2, s_b 3, s_b 4; } S_un_b; struct { u_short s_w 1, s_w 2; } S_un_w; u_long S_addr; } S_un;
Формы IP адреса ¡ ¡ ¡ двоичное число: 1000 0110 0001 1000 0000 1000 0100 0010 десятичное с точкой: 134. 24. 8. 66 десятичное без знака: 2249721922 десятичное со знаком: – 2045245374 шестнадцатеричное: 0 x 86180842
Структура сервисов и хоста struct servent{ char FAR* s_name; // название службы char FAR* s_aliases; // список псевдонимов short s_port; // номер порта char FAR* s_proto; //транспортный протокол }
Структура сервисов и хоста struct hostent{ char FAR* h_name; // имя хоста char FAR* h_aliases; // список псевдонимов short h_addrtype; // тип адреса хоста short h_length; //длина адреса char FAR* h_addr_list; //список адресов хоста }
Функции для работы с базами данных gethostbyaddr() Возвращает имена и IP адрес, соответствующие сетевому адресу и записывает hostent gethostbyname() Возвращает имена и IP адрес, соответствующие сетевому имени и записывает hostent gethostname() Возвращает имя докального сетевого компьютера getprotobyname() Возвращает официальное имя и номер протокола по указанному имени протокола и записывает protoent getprotobynumber() Возвращает официальное имя и номер протокола по указанному номеру протокола и записывает protoent getservbyname() Возвращает имя сетевой службы и номер порта протокола по указанному имени протокола и записывает в servent getservbyport() Возвращает имя сетевой службы и номер порта протокола по указанному номеру портаи записывает в servent
База данных по сетевым службам
32. Файл сервисов services #
# This is a sample LMHOSTS file used by the Microsoft TCP/IP for Windows. # # 102. 54. 97 rhino #PRE #DOM: networking #net group's DC # 102. 54. 94. 102 "appname x 14" #special app server # 102. 54. 94. 123 popular #PRE #source server # 102. 54. 94. 117 localsrv #PRE #needed for the include # # #BEGIN_ALTERNATE # #INCLUDE \localsrvpubliclmhosts # #INCLUDE \rhinopubliclmhosts # #END_ALTERNATE #
33. Windows-расширения функций сокета WSAAsync. Get. Host. By. Addr() gethostbyaddr() WSAAsync. Get. Host. By. Name() gethostbyname() WSAAsync. Get. Proto. By. Name() getprotobyname() WSAAsync. Get. Proto. By. Number() getprotobynumber() WSAAsync. Get. Serv. By. Name() getservbyname() WSAAsync. Get. Serv. By. Port() getservbyport() WSAAsync. Select() Асинхронный вариант select() WSAGet. Last. Error() Возвращает сообщение об ошибке WSASet. Last. Error() Фиксирует сообщение об ошибке для вызова WSAGet. Last. Error() WSAStart. Up() Инициирует Winsock. dll
34. Ориентированные на соединение сокеты Клиент инициирует соединение Функция устанавливает сетевое соединение. int Result = connect (shandle, remote_socket_address, address_length) Сервер пассивно прослушивает порт Функция связывает локальный адрес компьютера и номер порта с сокетом: int Result = bind (socket_handle, local_socket_address, address_length) Программа-сервер ожидает запроса от клиента. int result=listen(socket_handle, quere_length) Для последовательного сервера quere_length=1 для параллельного сервера quere_length=5. Socket s=accept(socket_handle, local_socket_address, address_length)
35. Передача данных через соединенный сокет n. Char. Send = send(socket_handle, sz. Buffer. Query, lstrlen(sz. Buffer. Query), send_flags); Чтение данных из соединенного сокета n. Char. Recv = recv(socket_handle, sz. Buffer, sizeof(sz. Buffer), recv_flags);
36. Ориентированные на соединение сокеты Socket() Bind() Listen() Accept() connect() Блокирование до поступления запроса от клиента send() recv() send() closesocket()
37. Не ориентированные на соединение сокеты Сервер и клиент, не ориентированные на соединение, пассивно прослушивает порт. Функция связывает локальный адрес компьютера и номер порта с сокетом: Result = bind(socket_handle, local_socket_address, address_length)
38. Передача данных через не соединенный сокет Передача данных через соединенный сокет n. Char. Send = sendto(socket_handle, sz. Buffer. Query, lstrlen(sz. Buffer. Query), send_flags, sockaddr_to_length); Чтение данных из соединенного сокета n. Char. Recv = recvfrom(socket_handle, sz. Buffer, sizeof(sz. Buffer), recv_flags, send_flags, sockaddr_from_length);