Общепринятая последовательность вызова функций при создании сетевых приложений с использованием гнeзд-сокетов

Страницы работы

Содержание работы

Общепринятая последовательность вызова функций при

создании сетевых приложений с использованием гнeзд-сокетов

(использование возможностей WinSockAPI)

1.  Большинство прототипов функций приведены в стиле Pascal-программирования.

2.  Необходимо анализировать возвращаемую каждой функцией целую переменную; в случае возврата кода ошибки (список кодов возврата см. в соответствующей документации) выполняется следующий параграф.

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

4.  В нижерасположенной таблице приведен синтаксис вызова основных  функций в синхронном режиме (например, функция  connect является синхронной, т.к.  ‘останавливает’ программу до момента соединения с удаленной ЭВМ и посему является блокирующей функцией).

N0

Используемая функция

Описание действия

1. 

function

WSAStartup

(wVersionRequired: work; lpWSData: PSWAData);

Инициализация возможностей WinSock

2.   

function

soket(domain, type,

protocol: Integer): TSocket;

Создание гнезда; в целой переменной TSocket  возвращается уникальный идентификатор созданного гнезда или INVALID_SOCKET, если новое гнездо создать невозможно

3.   

function

bind(s: TSocket;

addr: TSockaddr; namelen: Integer):

Integer;

Настройка гнезда s  данной ЭВМ (присвоение сетевого адреса гнезду, адрес должен содержаться в поле sa_data структуры TSockaddr)    (*)

4.   

procedure

connect(s: TSocket;

var name: TSockaddr; namelen: Integer):

Integer;

Соединение с другой ЭВМ (адрес гнезда на удаленной ЭВМ задается  в поле sa_data  структуры name). Коды типичных ошибок - WSAETIMEDOUT или WSAECONNREFUSED (неожиданное отключение соединения или отказ сторонней ЭВМ в соединении соответственно)

5.   

function

listen(s: TSocket;

backlog: Integer):

Integer;

Включает для сокета s  режим прослушивания запроса на соединение; используется при создании серверных приложений

6.   

function

accept(s: TSocket;

var addr: TSockaddr;

var addrlen: Integer):

Integer;

Создает новый сокет для приема сообщения (адрес сокета удаленной ЭВМ заносится в переменную addr);  ранее созданный сокет (с идентификатором s) остается активным для прослушивания. Функция обычно выполняется после вызова listen

7.   

function

send(s: TSocket;

buf: PChar;

len, flags:Integer):

Integer;

Через сокет s посылаются данные из буфера buf длиной len байт; режим отправки задает flags. При успешной отправке возвращается количество отправленных бит, при неудаче - SOCKET_ERROR

8.   

function

recv(s: TSocket; var buf: PChar;

len, flags: Integer):

Integer;

Через сокет s данные принимаются в (пустой) буфер buf длиной len. При успешном приеме возвращается количество принятых бит, при неудаче - SOCKET_ERROR

9.   

function

shutdown(s: TSocket; how: Integer):

Integer;

Перед закрытием  гнезда s необходимо приостановить его работу с помощью функции shutdown (переменная how определяет режим прекращения работы гнезда)

10.   

funcion

closesocket(s: TSocket): Integer;

Закрытие гнезда s после окончания работы с ним; предварительно необходимо выполнить функцию shutdown

11.   

function

WSACancelBlockingCall: Integer;

Отмена всех ранее установленных и не снятых блокировок

12.   

function

WSACleanup: Integer;

Прекращение работы WinSock перед закрытием приложения

(*)   Структуры (записи в терминологии Pascal’я) и указатели  определены как

PSockAddr = ^TSockAddr;

TSockAddr = packed record;

case Integer of

0: (sin_family: u_short;

sin_port:    u_short;

sin_port:    TInAddr;

sin_zero:   array [0..7] of Char;

1:  (sa_family: u_short;

sa_data:    array [0..7] of Char;

end;

PInAddr = ^TInAddr;

TInAddr = packed record

case Integer of

0: (S_un_b:  SunB);

1: (S_un_w: SunW);

2: (S_addr:  u_long);

end;

5. Для перевода гнезда (сокета) в асинхронный режим используется функция (обычно вызываемая сразу после создания гнезда)

function

WSAAsyncSelect(s: TSocket;  HWindow: HWND;

wMsg: u_int; lEvent: Longint): Integer;

Похожие материалы

Информация о работе