Общепринятая последовательность вызова функций при
создании сетевых приложений с использованием гн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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.