Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СистПриклПрогЗабез(Хихловская).doc
Скачиваний:
28
Добавлен:
10.02.2016
Размер:
961.02 Кб
Скачать

Программная реализация архитектуры клиент – сервер

Роль программ клиента и сервера бывает разной. Иногда они равноправные.

В случае с ТСР/IР различие четкое. Сервер обслуживает порт, чтобы обнаружить входящие соединения или ИДР-дейтограммы от одного или нескольких клиентов с другой стороны клиент – это тот, кто первым начал диалог.

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

Элементы АРI сокетов

Рисунок 1 – основные вызовы сокетов для клиентов

Адрес удаленного Хоста задается с помощью структуры sockaddr_in, которая передается функции connect. Первый шаг – это получение сокета для логического соединения с помощью системного вызова socket

#include <sys/socket.h>/*UNIX*/

#include <winsock2.h>/*windows*/

Socket socket (int domain, int type, int protocol);

Возвращаемое значение: дескрипторов в случае успеха; -1 (UNIX) или INVALID_SOCKET(Windows)-ошибка АРI сокетов не зависит от протокола и может поддерживать разные адресные домены. Параметр domain—константа, указывающая, какой домен нужен сокету. Чаще используются домены AF_INET (Internet) и AF_LOCAL(или AF_UNIX). AF_LOCAL применяется для межпроцесного взаимодействия (IC) на одной машине. Вместо AF можно использовать PF_*. Параметр type задает тип создаваемого сокета.

Возможные значения сокетов:

  1. SOCK_STREAM – обеспечивает нужный дуплексный протокол на основе установления логического соединения (ТСР)

  2. SOCK_DGRAM – обеспечивает ненадежный сервис доставки дейтограмм (ИДР)

  3. SOCK_RAW – предоставляет доступ и некоторым дейтограмм на уровне IP, используется, например, для просмотра всех ICMP—сообщений

Параметр protocol показывает, какой протокол следует использовать с данным сокетом. В качестве TCP/IP он обычно неявно определяется типом сокета, поэтому в качестве значения задают 0.

Для самого простого TCP-клиента требуется еще один вызов АРI сокетов, обеспечивающий установление соединения:

#include <sys/socket.h>/*UNIX*/

#include <winsock2.h>/*windows*/

int connect (SOCKET_s, const struct sockaddr*peer, int peer_len);

Возвращаемое значение: 0-нормально, -1 (UNIX) или не 0 – ошибка

s-параметр, который является дескриптором сокета, который вернул системный вызов SOCKET.

Параметр peer указывает на структуру, в которой хранится адрес удаленного хоста и дополнительная информация.

Для домена AF_INET –это структура типа sockaddr_in. Параметр peer_len содержит размер структуры в байтах, на которую указывает peer.

После установления соединения можно передавать данные. В ОС UNIX нужно обратиться к системным вызовам read и write и передать или дескриптор сокета.

#include <sys/socket.h>/*UNIX*/

#include <winsock2.h>/*windows*/

int recv (socket s, woid*buf, suze_tlen, int flags);

int send (socket s, const void*buf, size_tlen, int flags);

Возвращаемое значение: число принять на переданных байтов в случае успеха или –1 в случае ошибки.

Параметры s, buf и len аналогичные используемым для read и write. Flags зависит от системы, но и UNIX и windows поддерживают следующие флаги:

  1. MSG_OOB – Следует послать или принять срочные данные

  2. MSG_PEEK – Используется для просмотра поступивших данных без их удаления из приемного буфера. После возврата из системного вызова данные еще могут быть получены при последующем вызове read или recv;

  3. MSG_DONTROUTEK – сообщает ядру, что не надо выполнять обычный алгоритм маршрутизации, как правило, используется программами маршрутизации и для диагностических целей.

При работе с протоколом TCP больше ничего не нужно. При работе с ИДР нужны системные вызовы recvfrom и sendto; они отличаются тем, что при отправлении дайтограмм позволяют задать адрес назначения, а при приеме -- получить адрес источника.

#include <sys/socket.h>/*UNIX*/

#include <winsock2.h>/*windows*/

int recvfrom (sockets, const void*size_t len, int flags, const struct sockaddr*to, int tolen);

Возвращаемое значение: число принятых и переданных байтов в случае успеха или –1 при ошибке. Параметры s, buf, Len, flags, --такие же, как в вызовах recv и send. Параметр from в вызове recvfrom указывает на структуру, в которую ядро помещает адрес источника пришедшей дейтограммы. Длина этого адреса хранится в целом числе, на которое указывает параметр fromLen (указатель на целое).

Параметр to в вызове sendto указывает на адрес структуры, содержащий адреса назначения дейтограммы, а параметр tolen – длина этого адреса. To – это целое, а не указатель.