Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod seti.doc
Скачиваний:
23
Добавлен:
01.04.2025
Размер:
306.18 Кб
Скачать

Int wsaCleanup(void);

Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки. Для получения кода последней ошибки, возвращённой Windows Sockets, используется функция:

Int wsaGetLastError(void);

Эта функция позволяет определить код ошибки при неудачном завершении практически всех функций интерфейса Windows Sockets. Её нужно вызывать сразу вслед за функцией, завершившейся неудачно. Если ошибка возникла при выполнении функции WSACleanup, функция WSAGetLastError может вернуть одно из следующих значений:

Значение

Описание

WSANOTINITIALISED

Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup

WSAENETDOWN

Сбой сетевого программного обеспечения

WSAEINPROGRESS

Во время вызова функции WSACleanup выполнялась одна из блокирующих функций интерфейса Windows Sockets

Сделаем небольшие пояснения относительно последней ошибки, приведённой в этом списке, имеющей код WSAEINPROGRESS. Некоторые функции интерфейса Windows Sockets способны блокировать работу приложения, так как они не возвращают управление до своего завершения. В операционных системах, использующих вытесняющую мультизадачность, к которым относятся Microsoft Windows 9x/Me, Windows NT4/5, это не приводит к блокировке всей системы. Можно избежать использования блокирующих функций, так как для них в интерфейсе Windows Sockets существует замена.

Создание и инициализация сокета.

После инициализации интерфейса Windows Sockets приложение должно создать один или несколько сокетов, которые будут использованы для передачи данных.

Сокет создаётся с помощью функции:

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

API сокетов не зависит от протокола и может поддерживать разные адресные домены. Параметр af – это константа, указывающая какой домен нужен сокету (определяет формат адреса). Этому параметру соответствуют домены AF_INET, что соответствует формату адреса, принятому в Internet, AF_LOCAL (или AF_UNIX) и AF_UNSPEC. Домен AF_LOCAL применяется для межпроцессного взаимодействия (IPC) на одной и той же машине. В устаревших вариантах вызова socket константы доменов обозначали как PF_* вместо современных AF_*. Но поскольку оба набора констант определены одинаково – в действительности одни константы просто выражаются через другие, - на практике можно употреблять оба варианта.

Домен AF_UNSPEC применяется в тех случаях, когда спецификация сокета определяется двумя другими параметрами.

Параметры type и protocol определяют соответственно тип сокета и протокол, который будет использован для данного сокета.

Тип сокета

Описание

SOCK_STREAM

Сокет будет использован для передачи данных через канал связи с использованием протокола TCP

SOCK_DGRAM

Сокет будет использован для передачи данных без создания канала связи через дейтаграммный протокол UDP

SOCK_RAW

Сокет будет использован для доступа к некоторым дейтаграммам на уровне протокола IP. Они используются в особых случаях, например для просмотра всех ICMP сообщений.

Параметр протокол должен быть определен константами связанными с протоколом, такими как IPPROTO_TCP и IPPROTO_UDP для протоколов TCP и UDP соответственно. Однако при использовании домена AF_INET достаточно указать только тип сокета, а для параметра protocol можно указать нулевое значение.

В случае успеха функция socket возвращает дескриптор, который можно использовать для выполнения всех операций над данным сокетом. Если же произошла ошибка, эта функция возвращает значение INVALID_SOCKET. Для анализа причины ошибки нужно вызвать функцию WSAGetLastError, которая в данном случае может вернуть один из следующих кодов ошибки:

Значение

Описание

WSANOTINITIALISED

Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup

WSAENETDOWN

Сбой сетевого программного обеспечения

WSAEAFNOSUPPORT

Указан неправильный тип адреса

WSAEINPROGRESS

Выполняется блокирующая функция интерфейса Windows Sockets

WSAEMFILE

Израсходован весь запас свободных дескрипторов

WSAENOBUFS

Нет памяти для создания буфера

WSAEPROTONOSUPPORT

Указан неправильный протокол

WSAEPROTOTYPE

Указанный протокол несовместим с данным типом сокета

WSAESOCKTNOSUPPORT

Указанный тип сокета несовместим с данным типом адреса

Фрагмент кода, в котором создаётся сокет для передачи данных с использованием протокола TCP:

srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (srv_socket == INVALID_SOCKET) {

MessageBox(NULL, “socket error”, “error”, MB_OK);

return 0;

}

Удаление сокета

Для освобождения ресурсов приложение должно закрывать сокеты, которые ему больше не нужны, вызывая функцию

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]