СОКЕТЫ. СОКЕТ Сокет – программный интерфейс для обеспечения обмена данными между процессами. Впервые socket API появилась в BSD Unix. Описан в POSIX В.

Презентация:



Advertisements
Похожие презентации
3. Механизм сокетов 3.1. Общие концепции 3.2. Интерфейсные функции для работы с сокетом Создание сокета Связывание и установление соединения.
Advertisements

Взаимодействие процессов: сокеты.
Механизм сокетов Средства межпроцессного взаимодействия ОС Unix, представленные в системе IPС, решают проблему взаимодействия процессов, выполняющихся.
СЕТЕВОЕ ПРОГРАММИРОВАНИЕ В LINUX. Со́кеты Со́кеты (англ. socket углубление, гнездо, разъём) название программного интерфейса для обеспечения обмена данными.
Корпоративные системы Лекция 3. Реализация архитектуры «Клиент- сервер» с использованием механизма сокетов.
TECHNOLOGIES Программирование Socket'ов Socket (гнездо, разъем) - абстрактное программное понятие, используемое для обозначения в прикладной.
СОКЕТЫ -2 РАБОТА СЕРВЕРА Стандартная схема работы плоха тем, что одновременно обслуживается только один клиент ! Это приводит к задержкам в работе сети.
Сокеты в Perl и PHP. Сокеты в Perl Сокеты являются «конечными пунктами» в процессе обмена данными. Одни типы сокетов обеспечивают надежный обмен данными,
Петрозаводский госуниверситет, А. В. Соловьев, 2007СЕТЕВЫЕ ТЕХНОЛОГИИ Технология клиент-сервер Архитектура распределённой вычислительной системы, в которой.
Сокеты Сети и системы телекоммуникаций Созыкин А.В.
Сети ЭВМ и телекоммуникации. Состояния сеанса TCP CLOSED Начальное состояние узла LISTEN Сервер ожидает запросов установления соединения от клиента SYN-SENT.
ПАРАМЕТРЫ СОКЕТА Методическое пособие по дисциплине «Программное обеспечение компьютерных сетей и информационных систем»
Стек протоколов TCP/IP сетевые адаптеры, модемы, кабельная система; формирование пакетов, целостность данных целостность пакетов, потоковая передача Межузловой.
Низкоуровневые операции в ИС. Сокеты в C#. Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня, в программе следует использовать.
1 Архитектура вычислительных систем. Лекция 10. Ловецкий К.П. Москва, ноябрь 2011 Взаимодействие по сети. Сокеты.
Интерфейс сокетов. Интерфейс прикладной программы (API) представляет собой просто набор функций (интерфейс), использующийся программистами для разработки.
Сокеты TCP/IP Лекция Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня (класс URL обеспечивает выполнение только.
Система межпроцессного взаимодействия IPC. Общие концепции #include key_t ftok ( char * filename, char proj ) filename строка, cодержащая имя файла proj.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
2.Система межпроцессного взаимодействия IPC 2.1.Состав, общие концепции 2.2.Очередь сообщений 2.3.Разделяемая память 2.4.Массив семафоров Взаимодействие.
Транксрипт:

СОКЕТЫ

СОКЕТ Сокет – программный интерфейс для обеспечения обмена данными между процессами. Впервые socket API появилась в BSD Unix. Описан в POSIX В программе сокет идентифицируется дескриптором – переменной типа int.

АТТРИБУТЫ СОКЕТА С каждым сокет связываются три атрибута : домен, тип и протокол. Эти атрибуты задаются при создании сокета и остаются неизменными на протяжении всего времени его существования #include int socket(int domain, int type, int protocol);

ДОМЕН СОКЕТА AF_UNIX – межпроцессное взаимодействие AF_INET – TCP/IP, IPv4 AF_INET6 – IPv6 AF_IPX – IPX ….

ТИП СОКЕТА SOCK_STREAM. Передача потока данных с предварительной установкой соединения. Обеспечивается надёжный канал передачи данных (TCP) SOCK_DGRAM. Передача данных в виде отдельных сообщений ( датаграмм ). Предварительная установка соединения не требуется. Обмен данными происходит быстрее, но является ненадёжным (UDP) SOCK_RAW. Этот тип присваивается низкоуровневым сокетам. (IP, ICMP, ARP…)

ПРОТОКОЛ СОКЕТА 0 – протокол по умолчанию Остальные варианты – RTFM :)

СХЕМА РАБОТЫ СЕТЕВОГО ПРИЛОЖЕНИЯ Создание сокета. Выбор домена и типа Привязка к определенному адресу и порту. Если пропустить, то произвольный порт. Подключение, если пропустить то создается канал без установления соединения. Прием или передача Разрыв соединения Закрытие сокета

ПРИВЯЗКА СОКЕТА #include int bind(int sockfd, struct sockaddr *addr, int addrlen); struct sockaddr { unsigned short sa_family; // Семейство адресов, AF_xxx char sa_data[14]; // 14 байтов для хранения адреса }; Используют sockaddr_XX (sockaddr_un, sockaddr_in)

SOCKADDR_IN struct sockaddr_in { short int sin_family; // Семейство адресов unsigned short int sin_port; // Номер порта struct in_addr sin_addr; // IP- адрес unsigned char sin_zero[8]; // " Дополнение " до размера структуры sockaddr }; struct in_addr { unsigned long s_addr; };

ХРАНЕНИЕ ДАННЫХ Существует два порядка хранения байтов в слове и двойном слове порядок хоста (host byte order) сетевой порядок (network byte order) htons (Host TO Network Short) htonl (Host TO Network Long) Обратно : ntohs и ntohl.

ХРАНЕНИЕ IP АДРЕСА В SOCKADDR Для преобразования IP адреса (« ») в in_addr используется int inet_aton(const char *cp, struct in_addr *in_p); Обратно : char *inet_ntoa(struct in_addr in); #define SERVER_ADDR " « inet_aton(SERVER_ADDR, &dest.sin_addr.s_addr)

УСТАНОВКА СОЕДИНЕНИЯ ( КЛИЕНТ ) #include int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); Делать bind не обязательно !

УСТАНОВКА СОЕДИНЕНИЯ ( СЕРВЕР ) bind: Если в качестве адреса INADDR_ANY – любой интерфейс Порт = 0 – система выберет сама int listen(int sockfd, int backlog); Переводит сокет в режим ожидания запросов от клиентов. Backlog – размер очереди запросов.

УСТАНОВКА СОЕДИНЕНИЯ ( СЕРВЕР ) int accept(int sockfd, void *addr, int *addrlen); Функция accept создаёт для общения с клиентом новый сокет и возвращает его дескриптор. addr – клиент. Можно сделать NULL, если не интересует.

ОБМЕН ДАННЫМИ int send(int sockfd, const void *msg, int len, int flags); Функция send возвращает число байтов, которое на самом деле было отправлено ( или -1 в случае ошибки ) !

ОБМЕН ДАННЫМИ int sendall(int s, char *buf, int len, int flags) { int total = 0; int n; while(total < len) { n = send(s, buf+total, len-total, flags); if(n == -1) break; total += n; } return (n==-1 ? -1 : total); }

ОБМЕН ДАННЫМИ int recv(int sockfd, void *buf, int len, int flags); Функция recv возвращает количество прочитанных байтов, которое может быть меньше размера буфера.

ЗАКРЫТИЕ СОКЕТА #include int close(int fd); Не забываем !

ДИАГНОСТИКА ОШИБОК #include errno – глобальная переменная, хранящая код последней ошибки. if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { perror("Socket"); exit(errno); }

ПРОСТОЙ КЛИЕНТ ( ИНИЦИАЛИЗАЦИЯ ) int sock; struct sockaddr_in addr; if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perraor("socket");a exit(errno); } bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(3425); // порт... addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //#define SERVER_ADDR " " //inet_aton(SERVER_ADDR, &addr.sin_addr.s_addr); if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("connect"); exit(errno); }

ПРОСТОЙ КЛИЕНТ ( ПРИЕМ - ПЕРЕДАЧА ) send(sock, message, sizeof(message), 0); recv(sock, buf, sizeof(message), 0); printf(buf); close(sock);

СЕРВЕР - ИНИЦИАЛИЗАЦИЯ int sock, listener; struct sockaddr_in addr; char buf[1024]; int bytes_read; listener = socket(AF_INET, SOCK_STREAM, 0); if(listener < 0) { perror("socket"); exit(errno); } addr.sin_family = AF_INET; addr.sin_port = htons(3425); addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(errno); }

СЕРВЕР - РАБОТА С КЛИЕНТАМИ listen(listener, 1); while(1) { sock = accept(listener, NULL, NULL); if(sock < 0) { perror("accept"); exit(errno); } while(1) { bytes_read = recv(sock, buf, 1024, 0); if(bytes_read

ОБМЕН ДАТАГРАММАМИ (UDP) int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); БЕЗ УСТАНОВКИ СОЕДИНЕНИЯ ! to, tolen, from, fromlen – адрес и его длина.