Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Необходимая информация




Цель работы

 

Практическое освоение механизма сокетов. Построение TCP-соединений для межпроцессного взаимодействия программ Клиента и Сервера в модели "Клиент-сервер".

 

Выполнение и защита лабораторной работы

1. Ознакомиться с заданием к лабораторной работе;

2. Ознакомиться с понятиями сокета, моделей взаимодействия между процессами на основе сокетов, структурами данных и адресацией, используемых при работе с сокетами, основными шагами при организации взаимодействия процессов в сети в режиме TCP-соединения;

3. Выбрать и изучить набор системных вызовов, обеспечивающих решение задачи;

4. Для указанного варианта составить две программы: программу - сервер и программу - клиент, реализующие требуемые действия;

5. Отладить и оттестировать составленную программу, используя инструментарий ОС;

6. Защитить лабораторную работу, ответив на контрольные вопросы.

 

 

 

Необходимая информация

Существует две модели взаимодействия между процессами в сети: модель соединений с протоколом TCP (Transmission Control Protocol), и модель дейтаграмм с протоколом UDP (User Datagram Protocol). В данной лабораторной работе используется первая из названных моделей.

 

Сокеты

Со́кеты (англ. socket — углубление, гнездо, разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

 

Следует различать клиентские и серверные сокеты. Клиентские сокеты грубо можно сравнить с оконечными аппаратами телефонной сети, а серверные — с коммутаторами. Клиентское приложение (например, браузер) использует только клиентские сокеты, а серверное (например, веб-сервер, которому браузер посылает запросы) — как клиентские, так и серверные сокеты.

 

Интерфейс сокетов впервые появился в BSD Unix. Программный интерфейс сокетов описан в стандарте POSIX.1 и в той или иной мере поддерживается всеми современными операционными системами.

 

Принцип работы

Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т.д.

 

Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.

 

Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.

Общая схема работы программы - сервера

1. Ожидание подключения клиента;

2. Установка соединения с клиентом;

3. Отправка клиенту сообщения;

4. Разрыв соединения и завершение программы.

Общая схема работы программы – клиента

1. Подключение к серверу;

2. Ожидание получения сообщения от сервера;

3. Отображение полученного сообщения;

4. Пользователю;

5. Разрыв соединения с сервером.

 

 

Примеры (язык Си)

Программа – сервер

Создание простейшего TCP-сервера состоит из следующих шагов:

· Создание TCP-сокетов вызовом функции socket().

· Привязывание сокета к прослушиваемому порту вызовом функции bind(). Перед вызовом bind() программист должен объявить структуру sockaddr_in, очистить ее (при помощи memset()), затем sin_family (PF_INET или PF_INET6) и заполнить поля sin_port (прослушиваемый порт, указать в виде последовательности байтов). Преобразование short int в порядок байтов может быть выполнено при помощи вызова функции htons() (сокращение от «от хоста в сеть»).

· Подготовка сокета к прослушиванию на предмет соединений (создание прослушиваемого сокета) при помощи вызова listen().

· Принятие входящих соединений через вызов accept(). Это блокирует сокет до получения входящего соединения, после чего возвращает дескриптор сокета для принятого соединения. Первоначальный дескриптор остается прослушиваемым дескриптором, а accept() может быть вызван вновь для этого сокета в любое время (пока он закрыт).

· Соединение с удаленным хостом, которое может быть создано при помощи send() и recv() или write() и read().

· Итоговое закрытие каждого открытого сокета, который больше не нужен, происходит при помощи close().

 

Код программы – сервера (Си)
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>   int main(void) { struct sockaddr_in stSockAddr; int i32SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);   if (i32SocketFD == -1) { perror("ошибка при создании сокета"); exit(EXIT_FAILURE); }   memset(&stSockAddr, 0, sizeof(stSockAddr));   stSockAddr.sin_family = PF_INET; stSockAddr.sin_port = htons(1100); stSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);   if (bind( i32SocketFD, (const void*)&stSockAddr, /* зачем приведение типа?: нужно, но (const sockaddr*) а не void */ sizeof(stSockAddr) ) == -1 ) { perror("ошибка связывания");   CloseSocketAndExitWithFailure: close(i32SocketFD); exit(EXIT_FAILURE); }   if (listen(i32SocketFD, 10) == -1) { perror("ошибка прослушивания"); goto CloseSocketAndExitWithFailure; }   for(;;) { int i32ConnectFD = accept(i32SocketFD, 0, 0);   if (i32ConnectFD < 0) { perror("ошибка принятия"); close(i32ConnectFD); /* нужно ли закрывать сокет после ошибки? */ goto CloseSocketAndExitWithFailure; }   /* выполнение операций чтения и записи... */   shutdown(i32ConnectFD, SHUT_RDWR);   close(i32ConnectFD); }   return 0; }

 

Программа – клиент

· Создание TCP-сокета вызовом socket().

· Соединение с сервером при помощи connect(), передача структуры sockaddr_in с sin_family с указанными PF_INET или PF_INET6, sin_port для указания порта прослушивания (в байтовом порядке), и sin_addr для указания IPv4 или IPv6 адреса прослушиваемого сервера (также в байтовом порядке).

· Взаимодействие с сервером при помощи send() и recv() или write() и read().

· Завершение соединения и сброс информации при вызове close().

 

Код программы – клиента (Си)
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>   int main(void) { struct sockaddr_in stSockAddr; int i32Res; int i32SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);   if (i32SocketFD == -1) { perror("Ошибка: невозможно создать сокет"); exit(EXIT_FAILURE); }   memset(&stSockAddr, 0, sizeof(stSockAddr));   stSockAddr.sin_family = PF_INET; stSockAddr.sin_port = htons(1100); i32Res = inet_pton(PF_INET, "192.168.1.3", &stSockAddr.sin_addr);   if (i32Res < 0) { perror("Ошибка: первый параметр не относится к категории корректных адресов"); CloseSocketAndExitWithFailure: close(i32SocketFD); exit(EXIT_FAILURE); } else if (!i32Res) { perror("Ошибка: второй параметр не содержит корректного IP-адреса"); goto CloseSocketAndExitWithFailure; }   if ( connect( i32SocketFD, (const void*)&stSockAddr, sizeof(stSockAddr) ) == -1 ) { perror("Ошибка соединения"); goto CloseSocketAndExitWithFailure; }   /* выполнение операций чтения и записи... */   shutdown(i32SocketFD, SHUT_RDWR);   close(i32SocketFD); return 0; }

 

(*) Приведены примеры для Unix подобных систем с использованием стандартных библиотек.

Подробнее о работе с сокетами в других системах можно посмотреть по ссылкам (указаны в разделе «Полезные ссылки»)

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных