Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


API –функции локального управления и установления связи библиотеки Wisock .



Socket-интерфейс представляет собой набор системных вызовов и/или библиотечных функций соответствующего языка программирования.

Для работы с «сокетами» в ОС Windows используется библиотека Winsock, представляющая собой набор библиотечных функций, разделенных на четыре группы:

- Локального управления

- Установления связи

- Обмена данными (ввода/вывода)

- Закрытия связи

Функции локального управления

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

Создание socket'а

Создание socket'а осуществляется следующим системным вызовом

int socket (domain, type, protocol)

int domain;

int type;

int protocol;

Аргументы:

- domain задает используемый для взаимодействия семейство адресов, для стека протоколов TCP/IP он может иметь символьное значение PF/AF_INET(семейство Internet-адресов).

- type задает тип сокета:

SOCK_STREAM - с установлением соединения (потоковый).

SOCK_DGRAM - без установления соединения(датаграммный).

- protocol задает конкретный протокол транспортного уровня (из нескольких возможных в стеке протоколов). Если этот аргумент задан равным 0, то будет использован протокол " по умолчанию" (TCP для SOCK_STREAM и UDP для SOCK_DGRAM при использовании стека протоколов TCP/IP).

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

При ошибке функция возвращает число " -1".

Привязка сокета к локальному адресу - bind

Локальный адрес = ( IP- адрес узла + тип протокола+ номер порта), int

bind (s, addr, addrlen)

int s;

struct sockaddr *addr;

int addrlen; Аргументы:

- s задает дескриптор связываемого socket'а;

- addr указатель на структуру данных, содержащую локальный адрес, приписываемый socketу. Для сетей TCP/IP такой структурой является sockaddr_in.

- addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.

В случае успеха bind возвращает 0, в противном случае - " -1".

Структура sockaddr_in используется несколькими функциями socket-интерфейса и определена следующим образом

struct sockaddr_in {    short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];     };

Поле sin_family определяет используемое семейство адресов, (для

TCP/IP имеет значение AF_INET).

Поле sin_addr содержит адрес (IP) узла сети.

Поле sin_port содержит номер порта на узле сети.

Поле sin_zero не используется.

В свою очередь определение структуры in_addr таково:

struct in_addr {

union {u_long S_addr; //32 – разрядное целое число для представления IP- адреса

/* другие (не интересующие нас) члены объединения */}

S_un;

#define s_addr S_un.S_addr            };

Структура sockaddr_in должна быть полностью заполнена перед выдачей истемного вызова bind. При этом, если поле sin_addr.s_addr имеет значение INADDR_ANY, и сервер имеет несколько IP- адресов, то системный вызов будет привязывать socket ко всем сразу.

Для инициализации библиотеки Winsock необходимо выполнить вызов функции WSAStartup ().

Функции установления связи – listen, accept, connect

Для установления связи " клиент-сервер" используются системные вызовы listen и accept (на стороне сервера), а также connect (на стороне клиента).

Ожидание установления связи- listen

Системный вызов listen открывает порт на прослушивание запросов на установление связи.

int listen (s, n);

int s;

int n;

Аргументы:

- s задает дескриптор socket'а, через который программа будет ожидать к ней запросы на соединене от клиентов. Socket должен быть предварительно создан системным вызовом socket и связан с адресом с помощью системного вызова bind.

-n определяет максимальную длину очереди входящих запросов на установление связи. Если какой-либо клиент выдаст запрос на установление связи при полной очереди, то этот запрос будет отвергнут.

Признаком удачного завершения системного вызова listen служит нулевой код возврата.

Запрос на установление соединения и создания виртуального канала –

connect

int connect (s, addr, addrlen)

int s;

struct sockaddr_in *addr;

int addrlen;

Аргументы:

-s задает дескриптор socket'а программы клиента,

- addr должен указывать на структуру данных sockaddr_in, содержащую IP-адрес и порт, приписанный socket'у программы-сервера, к которой делается запрос на соединение.( Для формирования значений полей структуры sockaddr_in удобно использовать функцию gethostbyname,, транслирующая символическое имя узла сети в его IP адрес).

- addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.

Для того, чтобы запрос на соединение был успешным, необходимо, по крайней мере, чтобы программа-сервер выполнила к этому моменту системный вызов listen.

При успешном выполнении запроса системный вызов connect возвращает 0, в противном случае - " -1«.

Примечание. Если к моменту выполнения connect используемый им socket клиента не был привязан к адресу посредством bind, то такая привязка будет выполнена автоматически.

Примечание. В режиме взаимодействия без установления соединения необходимости в выполнении системного вызова connect нет.

Прием запроса на установление соединения и установки виртуального канала - accept,

int accept (s, addr, p_addrlen)

int s;

struct sockaddr_in *addr;

int *p_addrlen;

Аргументы:

- s задает дескриптор socket'а, через который программа-сервер получила запрос на соединение (посредством системного запроса listen

-addr должен указывать на область памяти, в которой разместится структуру данных, содержащая адрес socket'а программы-клиента, сделавшей запрос на соединение. Никакой инициализации этой области не требуется.

-p_addrlen задает размер (в байтах) области памяти, указываемой аргументом addr.

Возвращает новый, «привязанный сокет » s_new для обслуживания соединения созданного функцией accept

Признаком неудачного завершения accept служит отрицательное возвращенное значение.

Функция блокирующая, если очередь запросов на момент выполнения accept пуста, то программа переходит в состояние ожидания поступления запросов от клиентов на неопределенное время.

Примечание. Системный вызов accept используется в программах-серверах, функционирующих только в режиме с установлением TCP.

 

 

41. API –функции обмена данными (ввод/вывод) и закрытия связи библиотеки Wisock.

Функции обмена данными - read, write, send, recv, sendto, recvfrom.

 

 read и write – аналогичны функциям, используемым для работы с файлами (при этом вместо дескрипторов файлов в них задаются дескрипторы socket'ов).

send, recv – функции специально ориентированные на работу с socket'ами.

sendto и recvfrom - используются, как правило, для обмена данными в режиме без установления логического соединения(UDP).

 

Посылка данных - send,

int send (s_new, buf, len, flags)

int s;

char *buf;

int len;

int flags;

 

Аргументы:

s _ new - задает дескриптор socket'а( возвращенный функцией accept), через который посылаются данные.

b uf - указывает на область памяти, содержащую передаваемые данные.

 len -задает длину (в байтах) передаваемых данных.

f lags- модифицирует исполнение системного вызова send. При нулевом значении этого аргумента вызов send полностью аналогичен системному вызову write.

При успешном завершении send возвращает количество байт данных переданных из области, указанной аргументом buf.

 

Получение данных recv

Для получения данных от партнера по сетевому взаимодействию используется системный вызов recv, имеющий следующий вид

int recv (s_new, buf, len, flags)

int s;

char *buf;

int len;

int flags;

 

s _ new - задает дескриптор socket'а, через который принимаются данные.

 buf - указывает на область памяти, предназначенную для размещения принимаемых данных.

l en - задает длину (в байтах) этой области.

flags - модифицирует исполнение системного вызова recv. При нулевом значении этого аргумента вызов recv полностью аналогичен системному вызову read.

При успешном завершении recv возвращает количество принятых в область, указанную аргументом buf, байт данных. recv – блокирующая функция. Если канал данных, определяемый дескриптором s, оказывается " пустым", то recv переводит программу в состояние ожидания до момента появления в нем данных.

 

 

Функции закрытия связи – shutdown, closesocket. Сброс буферизованных данных - shutdown

Для закрытия канала связи с партнером (путем " сброса" еще не переданных или не принятых данных) используется системный вызов shutdown, выполняемый перед close и имеющий следующий вид:

int shutdown (s_new, how)

   int s_new;

   int how;

 s _ new - задает дескриптор ранее созданного socket'а.

 how - задает действия, выполняемые при очистке системных буферов socket'а:

0 - сбросить и далее не принимать данные для чтения из socket'а;

1 - сбросить и далее не отправлять данные для посылки через socket;

2 - сбросить все данные, передаваемые через socket в любом направлении.

Системный вызов close socket - используется для закрытия ранее созданного socket'а

Int closesocket (s)

int s_new;

s _ new - задает дескриптор ранее созданного socket'а.

В режиме с установлением логического соединения внутрисистемные механизмы обмена будут пытаться передать/принять данные, оставшиеся в канале передачи на момент закрытия socket'а. На это может потребоваться значительный интервал времени, неприемлемый для некоторых приложений. Для этого необходимо предварительно использовать системный вызов shutdown.

 

 

42. Схема взаимодействия между клиентом и сервером по протоколу TCP (последовательность API - функций).

Для получения адреса узла сети TCP/IP по его символическому имени используется библиотечная функция

struct hostent *gethostbyname (name)

char *name;

Аргумент name задает адрес последовательности литер, образующих символическое имя узла сети. При успешном завершении функция возвращает указатель на структуру hostent, имеющую следующий вид

    struct hostent {

   char *h_name;

   char **h_aliases;

   int h_addrtype;

   int h_lenght;

char *h_addr;     };

Поле h_name указывает на официальное (основное) имя узла.

Поле h_aliases указывает на список дополнительных имен узла (синонимов), если они есть.

Поле h_addrtype содержит идентификатор используемого набора протоколов, для сетей TCP/IP это поле будет иметь значение AF_INET.

Поле h_lenght содержит длину адреса узла.

Поле h_addr указывает на область памяти, содержащую адрес узла в том виде, в котором его используют системные вызовы и функции socket-интерфейса.

 

 

 


Поделиться:



Последнее изменение этой страницы: 2019-04-09; Просмотров: 335; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.037 с.)
Главная | Случайная страница | Обратная связь