
- •5. Управление коммуникациями в ос
- •5.1. Общая характеристика коммуникаций
- •5.2. Концепции технологии Клиент-Сервер
- •5.3. Внутренние коммуникации между процессами
- •5.3.1. Неименованные каналы
- •5.3.2. Обмен сообщениями
- •5.3.3. Обмен данными через Clipboard
- •1. Подготовка данных для передачи в Clipboard;
- •1. Открытие Clipboard
- •2. Проверка наличия требуемого формата данных в Clipboard
- •3. Чтение данных из Clipboard
- •4. Закрытие Clipboard
- •5.3.4. Обмен данными по технологии dde
- •5.3.5. Обмен данными по технологии ole
- •5.3.5.1. Введение
- •5.3.5.2. Понятие документ-ориентированной среды
- •5.3.5.3. Принципы ole
- •5.3.5.4. Характеристика технологии ole
- •5.3.5.4.1. Ole реализует концепцию визуального редактирования - редактирования на месте.
- •5.3.5.4.2. Другой особенностью ole является возможность приложения предоставить ряд своих функций (например, проверку орфографии) для доступа из других приложений - ole-Automation.
- •5.3.5.4.3. Ядром ole стал способ хранения данных в составном документе.
- •5.3.5.4.4. Дополнительные возможности ole:
- •5.3.5.4.5. Иерархия средств ole
- •5.3.5.4.6. Недостатки ole
- •5.3.5.4.7. Трехуровневая адресация ole-объекта
- •5.4. Внешние коммуникации
- •5.4.1. Протоколы тср/ip
- •5.4.1.1. Определение и достоинства протокола tcp/ip
- •5.4.1.2. Архитектура tcp/ip
- •5.4.1.3. Соответствие между моделями tcp/ip и iso osi
- •5.4.2. Протокол ip
- •5.4.2.1. Структура заголовка ip-пакета
- •5.4.3. Протокол udp
- •5.4.4. Протокол tcp
- •5.4.4.1. Структура tcp-сегмента
- •5.4.4.2. Этапы tcp-сеанса
- •5.4.5. Программные средства поддержки сетей
- •5.4.5.1. Состав программных средств поддержки сетей
- •1. Почтовые ящики
- •2. Именованные каналы
- •3. Удаленные вызовы процедур
- •4. Протокол NetBios
- •5.4.5.2. Программные средства работы с сокетами
- •5.4.6. Сетевое программное обеспечение уровня приложений
- •5.4.6.1. Протокол ftp
- •5.4.6.2. Протокол smtp
5.4.5.2. Программные средства работы с сокетами
Сокеты являются фактическим стандартом взаимодействия систем через существующие сети TCP/IP. Они позволяют соединяться машинам, на которых выполняются разные операционные системы.
Так же как и ранее две системы, соединяющиеся через сокеты, будут выступать в качестве сервера и клиента.
Рассмотрим основные этапы создания соединения, обмена данными и разъединения в приложениях сервера и клиента.
Сервер. Создание соединения.
Вопрос (
1. Сокет создается вызовом:
SrvLstSock = socket(AF_INET, SOCK_STREAM, 0);
Где:
AF_INET – тип адреса;
SOCK_STREAM – тип транспорта, поток или датаграммы
2. После создания сокета надо заполнить специальную структуру данных sockaddr, в которой указывается тип адреса, номер порта и IP-адрес.
struct sockaddr_in SrvLstAddr;
SrvLstAddr.sin_family = AF_INET;
SrvLstAddr.sin_port = htons(LocalPort);
SrvLstAddr.sin_addr.s_addr = htonl(INADDR_ANY);
3. Далее, созданный сокет привязывают к описанной структуре данных:
bind(SrvLstSock,(struct sockaddr*)&SrvLstAddr,sizeof(SrvLstAddr)));
4. Следующим этапом является перевод сокета в состояние прослушивания:
listen(SrvLstSock, 1);
Функции передается число возможных подключений, в данном случае 1.
5. Подключение клиента производится через функцию accept(), при этом создается экземпляр нового сокета, непосредственно работающего с клиентом, а старый сокет продолжает слушать новые запросы:
SrvrSock = accept(SrvLstSock,(struct sockaddr*)&SrvrAddr,&SrvrAddrLen);
Функция accept() приостанавливает выполнение программы (синхронная), поэтому ее лучше выполнить в отдельном потоке.
)Вопрос
Клиент. Создание соединения.
Вопрос (
1. Клиент создает сокет аналогичным вызовом:
ClntSock = socket(AF_INET, SOCK_STREAM, 0);
2. Затем заполняет структуру данных, указывая адрес и порт удаленного хоста:
struct sockaddr_in ClntSAddr;
ClntSAddr.sin_family = AF_INET;
ClntSAddr.sin_port = htons(RemotePort);
ClntSAddr.sin_addr.s_addr = inet_addr(RemoteHost);
3. После этого клиент вызывает функцию соединения с удаленным хостом, которую лучше выполнять в цикле и в отдельном потоке:
while (SOCKET_ERROR == connect(ClntSock, (struct sockaddr*)&ClntSAddr, sizeof(ClntSAddr))){
}
Приведенная схема взаимодействия сервера и клиента при соединении позволяет сделать несущественной очередность загрузки приложений. То приложение, которое будет загружено первым, будет ждать загрузки второго приложения. После загрузки обоих приложений состоится соединение.
)Вопрос
Вопрос (
Обмен данными производится с помощью вызовов:
send(ClntSock, trnbuf, strlen(trnbuf), 0));//клиент посылает данные
recv(SrvrSock, recbuf, strlen(recbuf), 0);//сервер принимает данные
Поскольку данные функции синхронные, то их лучше вызывать в отдельных потоках, чтобы другие действия приложений выполнялись.
Для закрытия соединения надо вызвать функции:
shutdown(SrvrSock,2);//2 - запрет передачи и приема
closesocket(SrvrSock);//закрытие сокета
closesocket(SrvLstSock);//закрытие сокета
)Вопрос