Глобальные сети компьютеров. Практическое введение в Internet


Передача и прием данных - часть 3


Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEINVAL Сокет не был подключен функцией bind
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets

Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.

При использовании параметра FD_CONNECT возможно появление следующих ошибок:

Код ошибки Описание
WSAEADDRINUSE Указанный адрес уже используется
WSAEADDRNOTAVAIL Указанный адрес не доступен
WSAEAFNOSUPPORT Для данного сокета нельзя использовать указанное семейство адресов
WSAECONNREFUSED Попытка установления канала связи была отвергнута
WSAEDESTADDRREQ Необходимо указать адрес получателя пакета
WSAEFAULT Неправильно указан параметр namelen
WSAEINVAL Сокет уже подключен к адресу
WSAEISCONN Сокет уже подсоединен
WSAEMFILE Больше нет доступных дескрипторов
WSAENETUNREACH Из данного узла и в данное время невозможно получить доступ к сети
WSAENOBUFS Нет места для размещения буфера
WSAENOTCONN Сокет на подключен
WSAENOTSOCK Указан дескриптор файла, а не сокета
WSAETIMEDOUT При попытке установления канала связи возникла задержка во времени

Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:

Код ошибки Описание
WSAENETDOWN Сбой в сети
WSAECONNRESET Сброс соединения удаленным узлом
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине

В том случае, когда указаны параметры FD_READ , FD_WRITE , FD_OOB , или FD_ACCEPT , может возникнуть ошибка с кодом WSAENETDOWN .

Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится, например, следующим образом:

void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char szTemp[256]; int rc;

// Если на сокете выполняется передача данных, // принимаем и отображаем эти данные в виде // текстовой строки if(WSAGETSELECTEVENT(lParam) == FD_READ ) { rc = recv ((SOCKET)wParam, szTemp, 256, 0); if(rc) { szTemp[rc] = '\0'; MessageBox(NULL, szTemp, "Reсeived data", MB_OK); } return; }

// Если соединение завершено, выводми об этом сообщение else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE ) { MessageBox(NULL, "Connection closed", "Server", MB_OK); } }

Отметим, что параметр wParam содержит дескриптор сокета, на котором выполняется передача данных, а параметр lParam - код события, которое произошло в сети.




Начало  Назад  Вперед



Книжный магазин