Поделиться через


Класс CAsyncSocket

Представляет сокет Windows — конечную точку сетевого взаимодействия.

Синтаксис

class CAsyncSocket : public CObject

Участники

Открытые конструкторы

Имя Описание
CAsyncSocket::CAsyncSocket Формирует объект CAsyncSocket.

Открытые методы

Имя Описание
CAsyncSocket::Accept Принимает подключение в сокете.
CAsyncSocket::AsyncSelect Запрашивает уведомление о событии для сокета.
CAsyncSocket::Attach Присоединяет дескриптор сокета к объекту CAsyncSocket .
CAsyncSocket::Bind Связывает локальный адрес со сокетом.
CAsyncSocket::Close Закрывает сокет.
CAsyncSocket::Connect Устанавливает подключение к сокету однорангового узла.
CAsyncSocket::Create Создает сокет.
CAsyncSocket::CreateEx Создает сокет с дополнительными параметрами.
CAsyncSocket::Detach Отсоединяет дескриптор сокета CAsyncSocket от объекта.
CAsyncSocket::FromHandle Возвращает указатель на CAsyncSocket объект, учитывая дескриптор сокета.
CAsyncSocket::GetLastError Возвращает состояние ошибки для последней операции, которая завершилась сбоем.
CAsyncSocket::GetPeerName Возвращает адрес однорангового сокета, к которому подключен сокет.
CAsyncSocket::GetPeerNameEx Получает адрес однорангового сокета, к которому подключен сокет (обрабатывает IPv6-адреса).
CAsyncSocket::GetSockName Возвращает локальное имя сокета.
CAsyncSocket::GetSockNameEx Возвращает локальное имя сокета (обрабатывает адреса IPv6).
CAsyncSocket::GetSockOpt Извлекает параметр сокета.
CAsyncSocket::IOCtl Управляет режимом сокета.
CAsyncSocket::Listen Устанавливает сокет для прослушивания входящих запросов на подключение.
CAsyncSocket::Receive Получает данные из сокета.
CAsyncSocket::ReceiveFrom Получает диаграмму данных и сохраняет исходный адрес.
CAsyncSocket::ReceiveFromEx Получает диаграмму данных и сохраняет исходный адрес (обрабатывает IPv6-адреса).
CAsyncSocket::Send Отправляет данные в подключенный сокет.
CAsyncSocket::SendTo Отправляет данные в определенное место назначения.
CAsyncSocket::SendToEx Отправляет данные в определенное место назначения (обрабатывает IPv6-адреса).
CAsyncSocket::SetSockOpt Задает параметр сокета.
CAsyncSocket::ShutDown Отключает и (или) Receive вызовы Send в сокете.
CASyncSocket::Socket Выделяет дескриптор сокета.

Защищенные методы

Имя Описание
CAsyncSocket::OnAccept Уведомляет сокет прослушивания о том, что он может принимать ожидающие запросы на подключение путем вызова Accept.
CAsyncSocket::OnClose Уведомляет сокет о закрытии сокета, подключенного к нему.
CAsyncSocket::OnConnect Уведомляет сокет подключения о завершении попытки подключения, будь то успешно или в ошибке.
CAsyncSocket::OnOutOfBandData Уведомляет получение сокета о том, что данные вне диапазона будут считываться в сокете, как правило, срочное сообщение.
CAsyncSocket::OnReceive Уведомляет сокет прослушивания о том, что есть данные, которые необходимо извлечь путем вызова Receive.
CAsyncSocket::OnSend Уведомляет сокет о том, что он может отправлять данные путем вызова Send.

Открытые операторы

Имя Описание
CAsyncSocket::operator = Назначает новое значение объекту CAsyncSocket .
CAsyncSocket::operator SOCKET Используйте этот оператор для получения SOCKET дескриптора CAsyncSocket объекта.

Открытые члены данных

Имя Описание
CAsyncSocket::m_hSocket Указывает дескриптор, подключенный к этому CAsyncSocket объектуSOCKET.

Замечания

Класс CAsyncSocket инкапсулирует API функций сокетов Windows, предоставляя объектно-ориентированное абстракции для программистов, которые хотят использовать сокеты Windows в сочетании с MFC.

Этот класс основан на предположении, что вы понимаете сетевые связи. Вы отвечаете за обработку блокирующих, байтовых различий и преобразований между строками Юникода и многобайтового набора символов (МБ CS). Если требуется более удобный интерфейс, который управляет этими проблемами для вас, см. класс CSocket.

Чтобы использовать CAsyncSocket объект, вызовите его конструктор, а затем вызовите Create функцию, чтобы создать базовый дескриптор сокета (тип SOCKET), за исключением принятых сокетов. Для сокета сервера вызывает Listen функцию-член и для сокета клиента вызывает Connect функцию-член. Сокет сервера должен вызывать Accept функцию при получении запроса на подключение. Используйте остальные CAsyncSocket функции для выполнения обмена данными между сокетами. По завершении удалите CAsyncSocket объект, если он был создан в куче, деструктор автоматически вызывает Close функцию. Тип SOCKET данных описан в статье Сокеты Windows: Фон.

Примечание.

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

Дополнительные сведения см. в статьях о сокетах Windows: использование классов CAsyncSocket и связанных статей., а также API сокетов Windows 2.

Иерархия наследования

CObject

CAsyncSocket

Требования

Заголовок.afxsock.h

CAsyncSocket::Accept

Вызовите эту функцию-член, чтобы принять подключение к сокету.

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

Параметры

rConnectedSocket
Ссылка, определяющая новый сокет, доступный для подключения.

lpSockAddr
Указатель на SOCKADDR структуру, которая получает адрес подключаемого сокета, как известно в сети. Точный формат аргумента lpSockAddr определяется семейством адресов, установленным при создании сокета. Если lpSockAddr и (или) lpSockAddrLen равно NULL, то возвращается не информация об удаленном адресе принятого сокета.

lpSockAddrLen
Указатель на длину адреса в lpSockAddr байтах. Это lpSockAddrLen параметр результата значения: изначально он должен содержать объем пространства, на который указывает lpSockAddr; при возврате он будет содержать фактическую длину (в байтах) возвращаемого адреса.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen слишком мал (меньше размера SOCKADDR структуры).

  • WSAEINPROGRESS Выполняется блокировка вызова сокетов Windows.

  • WSAEINVALListen не был вызван до принятия.

  • WSAEMFILE Очередь пуста после записи, чтобы принять и нет доступных дескрипторов.

  • WSAENOBUFS Буферное пространство недоступно.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPP Сокет, на который ссылается ссылка, не является типом, поддерживающим службу, ориентированную на подключение.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка и не принимается никаких подключений.

Замечания

Эта подпрограмма извлекает первое подключение в очереди ожидающих подключений, создает новый сокет с теми же свойствами, что и этот сокет, и присоединяет его к rConnectedSocketнему. Если в очереди отсутствуют ожидающие подключения, Accept возвращается ноль и GetLastError возвращает ошибку. Принятый сокет (rConnectedSocket) не может использоваться для принятия дополнительных подключений. Исходный сокет остается открытым и прослушивающим.

Аргумент lpSockAddr представляет собой результирующий параметр, заполненный адресом подключающегося сокета, как известно для слоя связи. Accept используется с типами сокетов на основе подключения, такими как SOCK_STREAM.

CAsyncSocket::AsyncSelect

Вызовите эту функцию-член, чтобы запросить уведомление о событии для сокета.

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Параметры

lEvent
Битовая маска, указывающая сочетание сетевых событий, в которых приложение заинтересовано.

  • FD_READ Хотите получать уведомление о готовности к чтению.

  • FD_WRITE Хотите получать уведомления, когда данные доступны для чтения.

  • FD_OOB Хотите получать уведомление о поступлении данных вне диапазона.

  • FD_ACCEPT Хотите получать уведомления о входящих подключениях.

  • FD_CONNECT Хотите получать уведомления о результатах подключения.

  • FD_CLOSE Хотите получать уведомления при закрытии сокета одноранговым элементом.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEINVAL Указывает, что один из указанных параметров недопустим.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

Замечания

Эта функция используется для указания функций уведомлений обратного вызова MFC для сокета. AsyncSelect автоматически устанавливает этот сокет в режим неблокировки. Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

CAsyncSocket::Attach

Вызовите эту функцию-член, чтобы подключить дескриптор к объекту hSocketCAsyncSocket .

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Параметры

hSocket
Содержит дескриптор сокета.

lEvent
Битовая маска, указывающая сочетание сетевых событий, в которых приложение заинтересовано.

  • FD_READ Хотите получать уведомление о готовности к чтению.

  • FD_WRITE Хотите получать уведомления, когда данные доступны для чтения.

  • FD_OOB Хотите получать уведомление о поступлении данных вне диапазона.

  • FD_ACCEPT Хотите получать уведомления о входящих подключениях.

  • FD_CONNECT Хотите получать уведомления о результатах подключения.

  • FD_CLOSE Хотите получать уведомления при закрытии сокета одноранговым элементом.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно.

Замечания

Дескриптор SOCKET хранится в элементе данных объекта m_hSocket .

CAsyncSocket::Bind

Вызовите эту функцию-член, чтобы связать локальный адрес со сокетом.

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Параметры

nSocketPort
Порт, определяющий приложение сокета.

lpszSocketAddress
Сетевой адрес, пунктирное число, например "128.56.22.8". NULL Передача строки для этого параметра указывает, что CAsyncSocket экземпляр должен прослушивать действия клиента во всех сетевых интерфейсах.

lpSockAddr
Указатель на SOCKADDR структуру, содержащую адрес для назначения этому сокету.

nSockAddrLen
Длина адреса в lpSockAddr байтах.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. В следующем списке рассматриваются некоторые ошибки, которые могут быть возвращены. Полный список см. в разделе "Коды ошибок сокетов Windows".

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEADDRINUSE Указанный адрес уже используется. (См. параметр сокета SO_REUSEADDR в SetSockOptразделе .)

  • WSAEFAULT Аргумент nSockAddrLen слишком мал (меньше размера SOCKADDR структуры).

  • WSAEINPROGRESS Выполняется блокировка вызова сокетов Windows.

  • WSAEAFNOSUPPORT Указанное семейство адресов не поддерживается этим портом.

  • WSAEINVAL Сокет уже привязан к адресу.

  • WSAENOBUFS Недостаточно доступных буферов, слишком много подключений.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

Эта подпрограмма используется в несоединяемой диаграмме данных или сокете потока перед последующими Connect или Listen вызовами. Прежде чем он сможет принимать запросы на подключение, прослушивающий сокет сервера должен выбрать номер порта и сделать его известным для сокетов Windows путем вызова Bind. Bind устанавливает локальную связь (номер узла или порт) сокета, назначив локальное имя неименованного сокета.

CAsyncSocket::CAsyncSocket

Создает пустой объект сокета.

CAsyncSocket();

Замечания

После создания объекта необходимо вызвать ее Create функцию-член, чтобы создать SOCKET структуру данных и привязать его адрес. (На стороне сервера связи сокетов Windows, когда прослушивающий сокет создает сокет для использования в вызове, вы не вызываете AcceptCreate этот сокет.)

CAsyncSocket::Close

Закрывает сокет.

virtual void Close();

Замечания

Эта функция освобождает дескриптор сокета, чтобы дальнейшие ссылки на нее завершаются ошибкой WSAENOTSOCK. Если это последняя ссылка на базовый сокет, связанные сведения об именовании и данные в очереди не карта. Деструктор объекта сокета вызывает Close вас.

Для , но не для CAsyncSocket, семантика Close влияет на параметры SO_LINGER сокета и SO_DONTLINGER.CSocket Дополнительные сведения см. в разделе "Функция-член GetSockOpt".

CAsyncSocket::Connect

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

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Параметры

lpszHostAddress
Сетевой адрес сокета, к которому подключен этот объект: имя компьютера, например "ftp.microsoft.com", или пунктирное число, например "128.56.22.8".

nHostPort
Порт, определяющий приложение сокета.

lpSockAddr
Указатель на SOCKADDR структуру, содержащую адрес подключенного сокета.

nSockAddrLen
Длина адреса в lpSockAddr байтах.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Если это означает код WSAEWOULDBLOCKошибки и приложение использует переопределиваемые обратные вызовы, приложение получит OnConnect сообщение после завершения операции подключения. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEADDRINUSE Указанный адрес уже используется.

  • WSAEINPROGRESS Выполняется блокировка вызова сокетов Windows.

  • WSAEADDRNOTAVAIL Указанный адрес недоступен на локальном компьютере.

  • WSAEAFNOSUPPORT Адреса в указанном семействе нельзя использовать с этим сокетом.

  • WSAECONNREFUSED Попытка подключения была отклонена.

  • WSAEDESTADDRREQ Требуется адрес назначения.

  • WSAEFAULT Аргумент неверный nSockAddrLen .

  • WSAEINVAL Недопустимый адрес узла.

  • WSAEISCONN Сокет уже подключен.

  • WSAEMFILE Больше дескрипторов файлов не доступны.

  • WSAENETUNREACH Сеть не может быть достигнута из этого узла в настоящее время.

  • WSAENOBUFS Буферное пространство недоступно. Не удается подключить сокет.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAETIMEDOUT Попытайтесь подключиться без установления подключения.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и подключение не может быть завершено немедленно.

Замечания

Если сокет не подключен, уникальные значения назначаются локальной ассоциации системой, а сокет помечается как привязанный. Обратите внимание, что если поле адреса структуры имен равно нулю, Connect возвращается ноль. Чтобы получить расширенные сведения об ошибке, вызовите функцию-член GetLastError .

Для сокетов потоков (тип SOCK_STREAM) активная связь инициируется к внешнему узлу. После успешного завершения вызова сокета сокет готов к отправке и получению данных.

Для сокета диаграммы данных (типSOCK_DGRAM) устанавливается назначение по умолчанию, которое будет использоваться при последующих Send вызовах.Receive

CAsyncSocket::Create

Create Вызовите функцию-член после создания объекта сокета, чтобы создать сокет Windows и подключить его.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

Параметры

nSocketPort
Известный порт, используемый с сокетом или 0, если вы хотите, чтобы сокеты Windows выбрали порт.

nSocketType
SOCK_STREAM или SOCK_DGRAM.

lEvent
Битовая маска, указывающая сочетание сетевых событий, в которых приложение заинтересовано.

  • FD_READ Хотите получать уведомление о готовности к чтению.

  • FD_WRITE Хотите получать уведомление о готовности к написанию.

  • FD_OOB Хотите получать уведомление о поступлении данных вне диапазона.

  • FD_ACCEPT Хотите получать уведомления о входящих подключениях.

  • FD_CONNECT Хотите получать уведомление о завершенных подключениях.

  • FD_CLOSE Хотите получать уведомление о закрытии сокета.

lpszSockAddress
Указатель на строку, содержащую сетевой адрес подключенного сокета, точечного числа, например "128.56.22.8". NULL Передача строки для этого параметра указывает, что CAsyncSocket экземпляр должен прослушивать действия клиента во всех сетевых интерфейсах.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEAFNOSUPPORT Указанное семейство адресов не поддерживается.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEMFILE Больше дескрипторов файлов не доступны.

  • WSAENOBUFS Буферное пространство недоступно. Не удается создать сокет.

  • WSAEPROTONOSUPPORT Указанный порт не поддерживается.

  • WSAEPROTOTYPE Указанный порт является неправильным типом для этого сокета.

  • WSAESOCKTNOSUPPORT Указанный тип сокета не поддерживается в этом семействе адресов.

Замечания

Create вызовы и при успешном выполнении вызовов SocketBind для привязки сокета к указанному адресу. Поддерживаются следующие типы сокетов:

  • SOCK_STREAM Предоставляет последовательность, надежные, полно дуплексные потоки на основе подключения. Использует протокол TCP для семейства адресов Интернета.

  • SOCK_DGRAM Поддерживает диаграммы данных, которые являются ненадежными, ненадежными пакетами фиксированной (обычно небольшой) максимальной длины. Использует протокол пользовательской диаграммы данных (UDP) для семейства адресов Интернета.

    Примечание.

    Функция-член Accept принимает ссылку на новый пустой CSocket объект в качестве параметра. Перед вызовом Acceptнеобходимо создать этот объект. Помните, что если этот объект сокета выходит из область, соединение закрывается. Не вызывайте Create этот новый объект сокета.

Важно!

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

Дополнительные сведения о сокетах потоков и диаграмм данных см. в статьях Windows Sockets: Background и Windows Sockets: Порты и адреса сокетов Windows и API сокетов Windows 2.

CAsyncSocket::CreateEx

CreateEx Вызовите функцию-член после создания объекта сокета, чтобы создать сокет Windows и подключить его.

Используйте эту функцию, если необходимо указать дополнительные параметры, такие как тип сокета.

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Параметры

pAI
Указатель на сведения о ADDRINFOT сокете, например тип семейства и сокета.

lEvent
Битовая маска, указывающая сочетание сетевых событий, в которых приложение заинтересовано.

  • FD_READ Хотите получать уведомление о готовности к чтению.

  • FD_WRITE Хотите получать уведомление о готовности к написанию.

  • FD_OOB Хотите получать уведомление о поступлении данных вне диапазона.

  • FD_ACCEPT Хотите получать уведомления о входящих подключениях.

  • FD_CONNECT Хотите получать уведомление о завершенных подключениях.

  • FD_CLOSE Хотите получать уведомление о закрытии сокета.

Возвращаемое значение

См. возвращаемое значение для Create().

Замечания

См. примечания.Create()

CAsyncSocket::Detach

Вызовите эту функцию-член, чтобы отсоединить дескриптор в элементе CAsyncSocket данных от объекта и задать значение m_hSocketNULL.m_hSocketSOCKET

SOCKET Detach();

CAsyncSocket::FromHandle

Возвращает указатель на CAsyncSocket объект.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Параметры

hSocket
Содержит дескриптор сокета.

Возвращаемое значение

Указатель на CAsyncSocket объект или NULL объект, к которому не CAsyncSocket подключен hSocketобъект.

Замечания

При указании дескриптора, если CAsyncSocket объект не присоединен к дескрипторуSOCKET, функция-член возвращаетсяNULL.

CAsyncSocket::GetLastError

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

static int PASCAL GetLastError();

Возвращаемое значение

Возвращаемое значение указывает код ошибки для последней подпрограммы API сокетов Windows, выполняемой этим потоком.

Замечания

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

Дополнительные сведения о кодах ошибок см . в API сокетов Windows 2.

CAsyncSocket::GetPeerName

Вызовите эту функцию-член, чтобы получить адрес сокета однорангового узла, к которому подключен этот сокет.

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Параметры

rPeerAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rPeerPort
Ссылка на порт UINT , в который хранится порт.

lpSockAddr
Указатель на SOCKADDR структуру, которая получает имя сокета однорангового узла.

lpSockAddrLen
Указатель на длину адреса в lpSockAddr байтах. При возврате lpSockAddrLen аргумент содержит фактический размер возвращаемого lpSockAddr в байтах.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недостаточно велик.

  • WSAEINPROGRESS Выполняется блокировка вызова сокетов Windows.

  • WSAENOTCONN Сокет не подключен.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

Для обработки адресов IPv6 используйте CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Вызовите эту функцию-член, чтобы получить адрес однорангового сокета, к которому подключен этот сокет (обрабатывает IPv6-адреса).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Параметры

rPeerAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rPeerPort
Ссылка на порт UINT , в который хранится порт.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недостаточно велик.

  • WSAEINPROGRESS Выполняется блокировка вызова сокетов Windows.

  • WSAENOTCONN Сокет не подключен.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

Эта функция совпадает с тем, что CAsyncSocket::GetPeerName она обрабатывает адреса IPv6, а также старые протоколы.

CAsyncSocket::GetSockName

Вызовите эту функцию-член, чтобы получить локальное имя сокета.

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Параметры

rSocketAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rSocketPort
Ссылка на порт UINT , в который хранится порт.

lpSockAddr
Указатель на SOCKADDR структуру, которая получает адрес сокета.

lpSockAddrLen
Указатель на длину адреса в lpSockAddr байтах.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недостаточно велик.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEINVALСокет не привязан к адресу.Bind

Замечания

Этот вызов особенно полезен при Connect выполнении вызова без первого вызова Bind . Этот вызов предоставляет единственное средство, с помощью которого можно определить локальную связь, заданную системой.

Для обработки адресов IPv6 используйте CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Вызовите эту функцию-член, чтобы получить локальное имя сокета (обрабатывает IPv6-адреса).

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

Параметры

rSocketAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rSocketPort
Ссылка на порт UINT , в который хранится порт.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недостаточно велик.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEINVALСокет не привязан к адресу.Bind

Замечания

Этот вызов совпадает с тем, что CAsyncSocket::GetSockName он обрабатывает адреса IPv6, а также старые протоколы.

Этот вызов особенно полезен при Connect выполнении вызова без первого вызова Bind . Этот вызов предоставляет единственное средство, с помощью которого можно определить локальную связь, заданную системой.

CAsyncSocket::GetSockOpt

Вызовите эту функцию-член, чтобы получить параметр сокета.

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

Параметры

nOptionName
Параметр сокета, для которого требуется извлечь значение.

lpOptionValue
Указатель на буфер, в котором возвращается значение запрошенного параметра. Значение, связанное с выбранным параметром, возвращается в буфере lpOptionValue. Целое число, указываемое lpOptionLen на исходное значение, должно содержать размер этого буфера в байтах, а при возврате — размер возвращаемого значения. Для SO_LINGER, это будет размер LINGER структуры; для всех остальных параметров он будет размером boOL или an int, в зависимости от параметра. Список параметров и их размеров см. в разделе "Примечания".

lpOptionLen
Указатель на размер буфера lpOptionValue в байтах.

nLevel
Уровень, на котором определен параметр; единственными поддерживаемыми уровнями являются SOL_SOCKET и IPPROTO_TCP.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Если параметр никогда не был задан SetSockOpt, GetSockOpt возвращает значение по умолчанию для параметра. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpOptionLen недопустим.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOPROTOOPT Параметр неизвестен или не поддерживается. В частности, SO_BROADCAST не поддерживается для сокетов типаSOCK_STREAM, а SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVESO_LINGERи SO_OOBINLINE не поддерживается в сокетах типаSOCK_DGRAM.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

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

Для следующих параметров поддерживаются GetSockOpt. Тип определяет тип данных, адресуемых lpOptionValue. Параметр использует уровеньIPPROTO_TCP; все остальные TCP_NODELAY параметры используют уровеньSOL_SOCKET.

Значение Тип Значение
SO_ACCEPTCONN BOOL Сокет прослушивает.
SO_BROADCAST BOOL Сокет настроен для передачи широковещательных сообщений.
SO_DEBUG BOOL Отладка включена.
SO_DONTLINGER BOOL Если значение true, SO_LINGER параметр отключен.
SO_DONTROUTE BOOL Маршрутизация отключена.
SO_ERROR int Получение состояния ошибки и очистка.
SO_KEEPALIVE BOOL Храните в живых отправляются.
SO_LINGER struct LINGER Возвращает текущие параметры затяжки.
SO_OOBINLINE BOOL Данные вне диапазона получаются в обычном потоке данных.
SO_RCVBUF int Размер буфера для получения.
SO_REUSEADDR BOOL Сокет может быть привязан к адресу, который уже используется.
SO_SNDBUF int Размер буфера для отправки.
SO_TYPE int Тип сокета (например, SOCK_STREAM).
TCP_NODELAY BOOL Отключить алгоритм Nagle для отправки объединенных пакетов.

Параметры распространения программного обеспечения Berkeley (BSD) не поддерживаются GetSockOpt :

Значение Тип Значение
SO_RCVLOWAT int Получение низкой водяной отметки.
SO_RCVTIMEO int Время ожидания получения.
SO_SNDLOWAT int Отправка низкой водяной отметки.
SO_SNDTIMEO int Время ожидания отправки.
IP_OPTIONS Получение параметров в заголовке IP-адресов.
TCP_MAXSEG int Получение максимального размера сегмента TCP.

Вызов GetSockOpt с неподдерживаемым параметром приведет к получению WSAENOPROTOOPT кода ошибки.GetLastError

CAsyncSocket::IOCtl

Вызовите эту функцию-член, чтобы управлять режимом сокета.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Параметры

lCommand
Команда, выполняемая в сокете.

lpArgument
Указатель на параметр для lCommand.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEINVALlCommand не является допустимой командой или lpArgument не является допустимым параметром для lCommand, или команда не применима к типу предоставленного сокета.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

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

  • FIONBIO Включите или отключите режим неблокировки в сокете. Параметр lpArgument указывает на точку DWORD, которая ненулевой, если режим неблокировки должен быть включен, и ноль, если он должен быть отключен. Если AsyncSelect он был выдан на сокете, любая попытка установить IOCtl сокет обратно в режим блокировки завершится ошибкой WSAEINVAL. Чтобы установить сокет обратно в режим блокировки и предотвратить WSAEINVAL ошибку, приложение должно сначала отключить AsyncSelect путем вызова AsyncSelect с параметром lEvent равным 0, а затем вызвать IOCtl.

  • FIONREAD Определите максимальное количество байтов, которые можно считывать с помощью одного Receive вызова из этого сокета. Параметр lpArgument указывает на точку DWORD , в которой IOCtl хранится результат. Если этот сокет имеет тип SOCK_STREAM, FIONREAD возвращает общий объем данных, которые можно считывать в одном Receiveсокете; это обычно совпадает с общим объемом данных в очереди в сокете. Если этот сокет имеет тип SOCK_DGRAM, возвращает размер первой диаграммы данных, FIONREAD в очереди на сокете.

  • SIOCATMARK Определите, считываются ли все внеполновые данные. Это относится только к сокету типа SOCK_STREAM , который был настроен для приема любых внеполосных данных ( SO_OOBINLINE). Если не требуется чтение данных вне диапазона, операция возвращает ненулевое значение. В противном случае возвращается значение 0, а следующая Receive или ReceiveFrom выполненная в сокете извлекает некоторые или все данные, предшествующие "mark"; приложение должно использовать SIOCATMARK операцию, чтобы определить, остаются ли все данные. Если есть обычные данные, предшествующие "срочным" (внеполосным) данным, он будет получен в порядке. (Обратите внимание, что или ReceiveReceiveFrom никогда не будет смешивать внеполосные и обычные данные в одном вызове.) Параметр lpArgument указывает на точку DWORD , в которой IOCtl хранится результат.

Эта функция представляет собой подмножество, ioctl() используемое в сокетах Berkeley. В частности, нет команды, которая эквивалентна FIOASYNC, в то время как SIOCATMARK это единственная команда уровня сокета, которая поддерживается.

CAsyncSocket::Listen

Вызовите эту функцию-член, чтобы прослушивать входящие запросы на подключение.

BOOL Listen(int nConnectionBacklog = 5);

Параметры

nConnectionBacklog
Максимальная длина, к которой может увеличиваться очередь ожидающих подключений. Допустимый диапазон составляет от 1 до 5.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEADDRINUSE Предпринята попытка прослушивать используемый адрес.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEINVAL Сокет не привязан Bind или уже подключен.

  • WSAEISCONN Сокет уже подключен.

  • WSAEMFILE Больше дескрипторов файлов не доступны.

  • WSAENOBUFS Буферное пространство недоступно.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPP Указанный сокет не является типом, поддерживающим Listen операцию.

Замечания

Чтобы принять подключения, сначала создается Createсокет, с которым указывается Listenневыполненная работа входящих подключений, а затем с ним принимаются Acceptподключения. Listen применяется только к сокетам, поддерживающим подключения, т. е. к типам SOCK_STREAM. Этот сокет помещается в режим "пассивный", где входящие подключения признаются и помещаются в очередь ожидающих принятия процессом.

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

Listen пытается продолжать функционировать рационально, если отсутствуют доступные порты (дескрипторы). Он будет принимать подключения до очистки очереди. Если порты становятся доступными, при возможности вызов ListenAccept или перезаполнение очереди до текущей или последней "невыполненной работы" и возобновление прослушивания входящих подключений.

CAsyncSocket::m_hSocket

Содержит дескриптор SOCKET для сокета, инкапсулированного этим CAsyncSocket объектом.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

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

virtual void OnAccept(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. Следующие коды ошибок применяются к функции-члену OnAccept :

  • 0 Функция выполнена успешно.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

Замечания

Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

CAsyncSocket::OnClose

Вызывается платформой для уведомления этого сокета о закрытии подключенного сокета процессом.

virtual void OnClose(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. К функции-члену применяются OnClose следующие коды ошибок:

  • 0 Функция выполнена успешно.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAECONNRESET Подключение было сброшено удаленной стороной.

  • WSAECONNABORTED Подключение было прервано из-за истечения времени ожидания или другого сбоя.

Замечания

Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

CAsyncSocket::OnConnect

Вызывается платформой, чтобы уведомить этот сокет подключения о завершении попытки подключения( успешно или в ошибке).

virtual void OnConnect(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. К функции-члену применяются OnConnect следующие коды ошибок:

  • 0 Функция выполнена успешно.

  • WSAEADDRINUSE Указанный адрес уже используется.

  • WSAEADDRNOTAVAIL Указанный адрес недоступен на локальном компьютере.

  • WSAEAFNOSUPPORT Адреса в указанном семействе нельзя использовать с этим сокетом.

  • WSAECONNREFUSED Попытка подключения была принудительно отклонена.

  • WSAEDESTADDRREQ Требуется адрес назначения.

  • WSAEFAULT Аргумент неверный lpSockAddrLen .

  • WSAEINVAL Сокет уже привязан к адресу.

  • WSAEISCONN Сокет уже подключен.

  • WSAEMFILE Больше дескрипторов файлов не доступны.

  • WSAENETUNREACH Сеть не может быть достигнута из этого узла в настоящее время.

  • WSAENOBUFS Буферное пространство недоступно. Не удается подключить сокет.

  • WSAENOTCONN Сокет не подключен.

  • WSAENOTSOCK Дескриптор — это файл, а не сокет.

  • WSAETIMEDOUT Попытка подключения истекло без установления подключения.

Замечания

Примечание.

В CSocketфункции OnConnect уведомления никогда не вызывается. Для подключений просто вызывается Connect, который возвращается при завершении подключения (успешно или в ошибке). Обработка уведомлений о подключении — это сведения о реализации MFC.

Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

Пример

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

Вызывается платформой для уведомления принимающего сокета о том, что отправляющий сокет имеет внеполосные данные для отправки.

virtual void OnOutOfBandData(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. К функции-члену применяются OnOutOfBandData следующие коды ошибок:

  • 0 Функция выполнена успешно.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

Замечания

Внеполучные данные — это логически независимый канал, связанный с каждой парой подключенных сокетов типа SOCK_STREAM. Канал обычно используется для отправки срочных данных.

MFC поддерживает исходящие данные, но пользователям класса CAsyncSocket не рекомендуется использовать его. Проще создать второй сокет для передачи таких данных. Дополнительные сведения о внеполосных данных см. в разделе Сокеты Windows: Уведомления сокетов.

CAsyncSocket::OnReceive

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

virtual void OnReceive(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. К функции-члену применяются OnReceive следующие коды ошибок:

  • 0 Функция выполнена успешно.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

Замечания

Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

Пример

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

Вызывается платформой для уведомления сокета о том, что теперь он может отправлять данные, вызвав Send функцию-член.

virtual void OnSend(int nErrorCode);

Параметры

nErrorCode
Последняя ошибка сокета. К функции-члену применяются OnSend следующие коды ошибок:

  • 0 Функция выполнена успешно.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

Замечания

Дополнительные сведения см. в статье "Сокеты Windows: уведомления сокетов".

Пример

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

Назначает новое значение объекту CAsyncSocket .

void operator=(const CAsyncSocket& rSrc);

Параметры

rSrc
Ссылка на существующий CAsyncSocket объект.

Замечания

Вызовите эту функцию, чтобы скопировать существующий CAsyncSocket объект в другой CAsyncSocket объект.

CAsyncSocket::operator SOCKET

Используйте этот оператор для получения SOCKET дескриптора CAsyncSocket объекта.

operator SOCKET() const;

Возвращаемое значение

В случае успешного выполнения дескриптор SOCKET объекта; в противном случае NULL.

Замечания

Вы можете использовать дескриптор для вызова API Windows напрямую.

CAsyncSocket::Receive

Вызовите эту функцию-член для получения данных из сокета.

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Параметры

lpBuf
Буфер для входящих данных.

nBufLen
Длина lpBuf в байтах.

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_PEEK Посмотрите на входящие данные. Данные копируются в буфер, но не удаляются из входной очереди.

  • MSG_OOB Обработка внеполосных данных.

Возвращаемое значение

Если ошибка не возникает, Receive возвращает количество полученных байтов. Если соединение закрыто, возвращается значение 0. В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAENOTCONN Сокет не подключен.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать сокет Receive после ShutDown вызова с nHow установленным значением 0 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и Receive операция будет блокироваться.

  • WSAEMSGSIZE Диаграмма данных слишком велика, чтобы поместиться в указанный буфер и была усечена.

  • WSAEINVAL Сокет не привязан к Bind.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

Замечания

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

Для сокетов типа SOCK_STREAMвозвращается столько сведений, сколько в настоящее время доступно до размера предоставленного буфера. Если сокет настроен для приема внеполосных данных (вариант SO_OOBINLINEсокета) и внеполосных данных нечитаются, будут возвращены только внеполунные данные. Приложение может использовать IOCtlSIOCATMARK этот параметр или OnOutOfBandData определить, остаются ли все больше внеполновые данные считываемыми.

Для сокетов диаграммы данных данные извлекаются из первой заквеченной диаграммы данных до размера предоставленного буфера. Если диаграмма данных больше, чем предоставленный буфер, буфер заполняется первой частью диаграммы данных, лишние данные теряются и Receive возвращают значение SOCKET_ERROR с заданным кодом WSAEMSGSIZEошибки. Если входящие данные не доступны в сокете, возвращается значение SOCKET_ERROR с заданным кодом WSAEWOULDBLOCKошибки. Функцию OnReceive обратного вызова можно использовать для определения времени поступления дополнительных данных.

Если сокет имеет тип SOCK_STREAM и удаленная сторона закрыла подключение корректно, Receive будет завершено немедленно с 0 байтов. Если подключение было сброшено, Receive ошибка завершится ошибкой WSAECONNRESET.

Receive следует вызывать только один раз для каждого CAsyncSocket::OnReceive вызова.

Пример

Пример см. в примере CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

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

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

Параметры

lpBuf
Буфер для входящих данных.

nBufLen
Длина lpBuf в байтах.

rSocketAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rSocketPort
Ссылка на порт UINT , в который хранится порт.

lpSockAddr
Указатель на структуру, содержащую исходный SOCKADDR адрес по возвращении.

lpSockAddrLen
Указатель на длину исходного адреса в lpSockAddr байтах.

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_PEEK Посмотрите на входящие данные. Данные копируются в буфер, но не удаляются из входной очереди.

  • MSG_OOB Обработка внеполосных данных.

Возвращаемое значение

Если ошибка не возникает, ReceiveFrom возвращает количество полученных байтов. Если соединение закрыто, возвращается значение 0. В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недопустим: lpSockAddr буфер слишком мал, чтобы разместить адрес однорангового узла.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEINVAL Сокет не привязан к Bind.

  • WSAENOTCONN Сокет не подключен (SOCK_STREAM только).

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать сокет ReceiveFrom после ShutDown вызова с nHow установленным значением 0 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и ReceiveFrom операция будет блокироваться.

  • WSAEMSGSIZE Диаграмма данных слишком велика, чтобы поместиться в указанный буфер и была усечена.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

Замечания

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

Для обработки адресов IPv6 используйте CAsyncSocket::ReceiveFromEx.

Для сокетов типа SOCK_STREAMвозвращается столько сведений, сколько в настоящее время доступно до размера предоставленного буфера. Если сокет настроен для приема внеполосных данных (вариант SO_OOBINLINEсокета) и внеполосных данных нечитаются, будут возвращены только внеполунные данные. Приложение может использовать IOCtlSIOCATMARK этот параметр или OnOutOfBandData определить, остаются ли все больше внеполновые данные считываемыми. lpSockAddrLen Параметры lpSockAddr игнорируются для SOCK_STREAM сокетов.

Для сокетов диаграммы данных данные извлекаются из первой заквеченной диаграммы данных до размера предоставленного буфера. Если диаграмма данных больше, чем предоставленный буфер, буфер заполняется первой частью сообщения, лишние данные теряются и ReceiveFrom возвращают значение SOCKET_ERROR с заданным кодом WSAEMSGSIZEошибки.

Если lpSockAddr значение ненулевое, а сокет имеет тип SOCK_DGRAM, сетевой адрес сокета, который отправляет данные, копируется в соответствующую SOCKADDR структуру. Значение, на которое указывает lpSockAddrLen , инициализируется на размер этой структуры и изменяется при возврате, чтобы указать фактический размер адреса, хранящегося там. Если входящие данные не доступны в сокете, вызов ожидает поступления данных, ReceiveFrom если сокет не блокируется. В этом случае значение SOCKET_ERROR возвращается с заданным кодом WSAEWOULDBLOCKошибки. Обратный OnReceive вызов можно использовать для определения времени поступления дополнительных данных.

Если сокет имеет тип SOCK_STREAM и удаленная сторона закрыла подключение корректно, ReceiveFrom будет завершено немедленно с 0 байтов.

CAsyncSocket::ReceiveFromEx

Вызовите эту функцию-член, чтобы получить диаграмму данных и сохранить исходный адрес в SOCKADDR структуре или в rSocketAddress (обрабатывает IPv6-адреса).

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

Параметры

lpBuf
Буфер для входящих данных.

nBufLen
Длина lpBuf в байтах.

rSocketAddress
Ссылка на CString объект, получающий ip-адрес точечного номера.

rSocketPort
Ссылка на порт UINT , в который хранится порт.

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_PEEK Посмотрите на входящие данные. Данные копируются в буфер, но не удаляются из входной очереди.

  • MSG_OOB Обработка внеполосных данных.

Возвращаемое значение

Если ошибка не возникает, ReceiveFromEx возвращает количество полученных байтов. Если соединение закрыто, возвращается значение 0. В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULT Аргумент lpSockAddrLen недопустим: lpSockAddr буфер слишком мал, чтобы разместить адрес однорангового узла.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEINVAL Сокет не привязан к Bind.

  • WSAENOTCONN Сокет не подключен (SOCK_STREAM только).

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать сокет ReceiveFromEx после ShutDown вызова с nHow установленным значением 0 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и ReceiveFromEx операция будет блокироваться.

  • WSAEMSGSIZE Диаграмма данных слишком велика, чтобы поместиться в указанный буфер и была усечена.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

Замечания

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

Эта функция совпадает с тем, что CAsyncSocket::ReceiveFrom она обрабатывает адреса IPv6, а также старые протоколы.

Для сокетов типа SOCK_STREAMвозвращается столько сведений, сколько в настоящее время доступно до размера предоставленного буфера. Если сокет настроен для приема внеполосных данных (вариант SO_OOBINLINEсокета) и внеполосных данных нечитаются, будут возвращены только внеполунные данные. Приложение может использовать IOCtlSIOCATMARK этот параметр или OnOutOfBandData определить, остаются ли все больше внеполновые данные считываемыми. lpSockAddrLen Параметры lpSockAddr игнорируются для SOCK_STREAM сокетов.

Для сокетов диаграммы данных данные извлекаются из первой заквеченной диаграммы данных до размера предоставленного буфера. Если диаграмма данных больше, чем предоставленный буфер, буфер заполняется первой частью сообщения, лишние данные теряются и ReceiveFromEx возвращают значение SOCKET_ERROR с заданным кодом WSAEMSGSIZEошибки.

Если lpSockAddr значение ненулевое, а сокет имеет тип SOCK_DGRAM, сетевой адрес сокета, который отправляет данные, копируется в соответствующую SOCKADDR структуру. Значение, на которое указывает lpSockAddrLen , инициализируется на размер этой структуры и изменяется при возврате, чтобы указать фактический размер адреса, хранящегося там. Если входящие данные не доступны в сокете, вызов ожидает поступления данных, ReceiveFromEx если сокет не блокируется. В этом случае значение SOCKET_ERROR возвращается с заданным кодом WSAEWOULDBLOCKошибки. Обратный OnReceive вызов можно использовать для определения времени поступления дополнительных данных.

Если сокет имеет тип SOCK_STREAM и удаленная сторона закрыла подключение корректно, ReceiveFromEx будет завершено немедленно с 0 байтов.

CAsyncSocket::Send

Вызовите эту функцию-член для отправки данных в подключенном сокете.

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Параметры

lpBuf
Буфер, содержащий передаваемые данные.

nBufLen
Длина данных в lpBuf байтах.

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_DONTROUTE Указывает, что данные не должны подвергаться маршрутизации. Поставщик сокетов Windows может игнорировать этот флаг.

  • MSG_OOB Отправка данных вне диапазона (SOCK_STREAM только).

Возвращаемое значение

Если ошибка не возникает, Send возвращает общее количество отправленных символов. (Обратите внимание, что это может быть меньше числа, указанного nBufLen.) В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEACCES Запрошенный адрес является широковещательным адресом, но соответствующий флаг не задан.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEFAULT Аргумент lpBuf не находится в допустимой части адресного пространства пользователя.

  • WSAENETRESET Подключение должно быть сброшено, так как реализация сокетов Windows удалена.

  • WSAENOBUFS Реализация сокетов Windows сообщает о взаимоблокировке буфера.

  • WSAENOTCONN Сокет не подключен.

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать Send сокет после ShutDown вызова с nHow установленным значением 1 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и запрошенная операция будет блокироваться.

  • WSAEMSGSIZE Сокет имеет тип SOCK_DGRAM, и диаграмма данных больше, чем максимальная, поддерживаемая реализацией сокетов Windows.

  • WSAEINVAL Сокет не привязан к Bind.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

Замечания

Send используется для записи исходящих данных в подключенный поток или сокеты диаграммы данных. Для сокетов диаграммы данных необходимо не превышать максимальный размер IP-пакетов базовых подсетей, который определяется iMaxUdpDg элементом в WSADATA структуре, возвращаемой AfxSocketInitв структуре. Если данные слишком длинны для передачи атомарны через базовый протокол, ошибка WSAEMSGSIZE возвращается через GetLastError, и данные не передаются.

Обратите внимание, что для сокета диаграммы данных успешное завершение Send не указывает, что данные были успешно доставлены.

В CAsyncSocket объектах типа SOCK_STREAMчисло записанных байтов может составлять от 1 до запрошенной длины в зависимости от доступности буфера как на локальных, так и на внешних узлах.

Пример

Пример см. в примере CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Вызовите эту функцию-член для отправки данных в определенное место назначения.

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

Параметры

lpBuf
Буфер, содержащий передаваемые данные.

nBufLen
Длина данных в lpBuf байтах.

nHostPort
Порт, определяющий приложение сокета.

lpszHostAddress
Сетевой адрес сокета, к которому подключен этот объект: имя компьютера, например "ftp.microsoft.com", или пунктирное число, например "128.56.22.8".

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_DONTROUTE Указывает, что данные не должны подвергаться маршрутизации. Поставщик сокетов Windows может игнорировать этот флаг.

  • MSG_OOB Отправка данных вне диапазона (SOCK_STREAM только).

lpSockAddr
Указатель на SOCKADDR структуру, содержащую адрес целевого сокета.

nSockAddrLen
Длина адреса в lpSockAddr байтах.

Возвращаемое значение

Если ошибка не возникает, SendTo возвращает общее количество отправленных символов. (Обратите внимание, что это может быть меньше числа, указанного nBufLen.) В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEACCES Запрошенный адрес является широковещательным адресом, но соответствующий флаг не задан.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEFAULTlpSockAddr Или lpBuf параметры не являются частью адресного пространства пользователя, или lpSockAddr аргумент слишком мал (меньше размера SOCKADDR структуры).

  • WSAEINVAL Недопустимое имя узла.

  • WSAENETRESET Подключение должно быть сброшено, так как реализация сокетов Windows удалена.

  • WSAENOBUFS Реализация сокетов Windows сообщает о взаимоблокировке буфера.

  • WSAENOTCONN Сокет не подключен (SOCK_STREAM только).

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать SendTo сокет после ShutDown вызова с nHow установленным значением 1 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и запрошенная операция будет блокироваться.

  • WSAEMSGSIZE Сокет имеет тип SOCK_DGRAM, и диаграмма данных больше, чем максимальная, поддерживаемая реализацией сокетов Windows.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

  • WSAEADDRNOTAVAIL Указанный адрес недоступен на локальном компьютере.

  • WSAEAFNOSUPPORT Адреса в указанном семействе нельзя использовать с этим сокетом.

  • WSAEDESTADDRREQ Требуется адрес назначения.

  • WSAENETUNREACH Сеть не может быть достигнута из этого узла в настоящее время.

Замечания

SendTo используется для диаграммы данных или сокетов потоков и используется для записи исходящих данных в сокет. Для сокетов диаграммы данных необходимо не превышать максимальный размер IP-пакетов базовых подсетей, который определяется iMaxUdpDg элементом в WSADATA структуре, заполненной AfxSocketInit. Если данные слишком долго передаются через базовый протокол, возвращается ошибка WSAEMSGSIZE, и данные не передаются.

Обратите внимание, что успешное завершение не SendTo указывает, что данные были успешно доставлены.

SendTo используется только в сокете SOCK_DGRAM для отправки диаграммы данных в определенный сокет, определенный параметром lpSockAddr .

Чтобы отправить широковещательную трансляцию ( SOCK_DGRAM только), адрес в lpSockAddr параметре должен быть создан с помощью специального IP-адреса INADDR_BROADCAST (определенного в файле WINSOCK.Hзаголовка сокетов Windows) вместе с указанным номером порта. Или, если параметр lpszHostAddress имеет значение NULL, сокет настраивается для широковещательной трансляции. Как правило, неизменяемый для широковещательной диаграммы данных превышает размер, с которым может произойти фрагментация, что означает, что часть данных диаграммы (за исключением заголовков) не должна превышать 512 байт.

Для обработки адресов IPv6 используйте CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Вызовите эту функцию-член для отправки данных в определенное место назначения (обрабатывает IPv6-адреса).

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

Параметры

lpBuf
Буфер, содержащий передаваемые данные.

nBufLen
Длина данных в lpBuf байтах.

nHostPort
Порт, определяющий приложение сокета.

lpszHostAddress
Сетевой адрес сокета, к которому подключен этот объект: имя компьютера, например "ftp.microsoft.com", или пунктирное число, например "128.56.22.8".

nFlags
Указывает способ, в котором выполняется вызов. Семантика этой функции определяется параметрами сокета и параметром nFlags . Последний создается путем объединения любого из следующих значений с побитовой оператором OR C++ (|):

  • MSG_DONTROUTE Указывает, что данные не должны подвергаться маршрутизации. Поставщик сокетов Windows может игнорировать этот флаг.

  • MSG_OOB Отправка данных вне диапазона (SOCK_STREAM только).

Возвращаемое значение

Если ошибка не возникает, SendToEx возвращает общее количество отправленных символов. (Обратите внимание, что это может быть меньше числа, указанного nBufLen.) В противном случае возвращается значение SOCKET_ERROR , и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEACCES Запрошенный адрес является широковещательным адресом, но соответствующий флаг не задан.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEFAULTlpSockAddr Или lpBuf параметры не являются частью адресного пространства пользователя, или lpSockAddr аргумент слишком мал (меньше размера SOCKADDR структуры).

  • WSAEINVAL Недопустимое имя узла.

  • WSAENETRESET Подключение должно быть сброшено, так как реализация сокетов Windows удалена.

  • WSAENOBUFS Реализация сокетов Windows сообщает о взаимоблокировке буфера.

  • WSAENOTCONN Сокет не подключен (SOCK_STREAM только).

  • WSAENOTSOCK Дескриптор не является сокетом.

  • WSAEOPNOTSUPPMSG_OOB указан, но сокет не имеет типа SOCK_STREAM.

  • WSAESHUTDOWN Сокет был выключен; Не удается вызвать SendToEx сокет после ShutDown вызова с nHow установленным значением 1 или 2.

  • WSAEWOULDBLOCK Сокет помечается как неблокировка, и запрошенная операция будет блокироваться.

  • WSAEMSGSIZE Сокет имеет тип SOCK_DGRAM, и диаграмма данных больше, чем максимальная, поддерживаемая реализацией сокетов Windows.

  • WSAECONNABORTED Виртуальный канал был прерван из-за истечения времени ожидания или другого сбоя.

  • WSAECONNRESET Виртуальный канал был сброшен удаленным каналом.

  • WSAEADDRNOTAVAIL Указанный адрес недоступен на локальном компьютере.

  • WSAEAFNOSUPPORT Адреса в указанном семействе нельзя использовать с этим сокетом.

  • WSAEDESTADDRREQ Требуется адрес назначения.

  • WSAENETUNREACH Сеть не может быть достигнута из этого узла в настоящее время.

Замечания

Этот метод совпадает с CAsyncSocket::SendTo тем, что он обрабатывает адреса IPv6, а также старые протоколы.

SendToEx используется для диаграммы данных или сокетов потоков и используется для записи исходящих данных в сокет. Для сокетов диаграммы данных необходимо не превышать максимальный размер IP-пакетов базовых подсетей, который определяется iMaxUdpDg элементом в WSADATA структуре, заполненной AfxSocketInit. Если данные слишком долго передаются через базовый протокол, возвращается ошибка WSAEMSGSIZE , и данные не передаются.

Обратите внимание, что успешное завершение не SendToEx указывает, что данные были успешно доставлены.

SendToEx используется только в сокете SOCK_DGRAM для отправки диаграммы данных в определенный сокет, определенный параметром lpSockAddr .

Чтобы отправить широковещательную трансляцию ( SOCK_DGRAM только), адрес в lpSockAddr параметре должен быть создан с помощью специального IP-адреса INADDR_BROADCAST (определенного в файле WINSOCK.Hзаголовка сокетов Windows) вместе с указанным номером порта. Или, если параметр lpszHostAddress имеет значение NULL, сокет настраивается для широковещательной трансляции. Как правило, неизменяемый для широковещательной диаграммы данных превышает размер, с которым может произойти фрагментация, что означает, что часть данных диаграммы (за исключением заголовков) не должна превышать 512 байт.

CAsyncSocket::SetSockOpt

Вызовите эту функцию-член, чтобы задать параметр сокета.

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

Параметры

nOptionName
Параметр сокета, для которого необходимо задать значение.

lpOptionValue
Указатель на буфер, в котором предоставляется значение запрошенного параметра.

nOptionLen
Размер буфера lpOptionValue в байтах.

nLevel
Уровень, на котором определен параметр; единственными поддерживаемыми уровнями являются SOL_SOCKET и IPPROTO_TCP.

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • WSAEFAULTlpOptionValue не находится в допустимой части адресного пространства процесса.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAEINVALnLevel недопустимо, или сведения в lpOptionValue недействительном состоянии.

  • WSAENETRESETвремя ожидания Подключение ion истекло при SO_KEEPALIVE установке.

  • WSAENOPROTOOPT Параметр неизвестен или не поддерживается. В частности, SO_BROADCAST не поддерживается для сокетов типаSOCK_STREAM, а SO_DONTLINGER, SO_KEEPALIVEи SO_LINGERSO_OOBINLINE не поддерживается в сокетах типаSOCK_DGRAM.

  • WSAENOTCONNПодключение было сброшено при SO_KEEPALIVE установке.

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

SetSockOpt задает текущее значение параметра сокета, связанного с сокетом любого типа в любом состоянии. Хотя параметры могут существовать на нескольких уровнях протокола, эта спецификация определяет только параметры, которые существуют на самом верхнем уровне сокета. Параметры влияют на операции сокета, такие как получение быстрых данных в обычном потоке данных, возможность передачи сообщений на сокет и т. д.

Существует два типа параметров сокета: логические параметры, которые позволяют включить или отключить функцию или поведение, а также параметры, требующие целочисленного значения или структуры. Чтобы включить логический параметр, lpOptionValue указывает на целое число, отличное от нуля. Чтобы отключить параметр lpOptionValue , указывает на целое число, равное нулю. nOptionLen значение должно быть равно логическому параметру sizeof(BOOL) . Для других параметров lpOptionValue указывает на целое число или структуру, содержащую требуемое значение для параметра, а nOptionLen также длину целого или структуры.

SO_LINGER управляет действием, выполненным при очередях неотступных данных в сокете, и Close функция вызывается для закрытия сокета.

По умолчанию сокет не может быть привязан (см Bind. ) к локальному адресу, который уже используется. Однако иногда может потребоваться "повторно использовать" адрес таким образом. Так как каждое подключение однозначно определяется сочетанием локальных и удаленных адресов, проблема с двумя сокетами не связана с тем же локальным адресом, если удаленные адреса отличаются.

Чтобы сообщить реализации сокетов Windows, что Bind вызов сокета не должен быть запрещен, так как нужный адрес уже используется другим сокетом, приложение должно задать SO_REUSEADDR параметр сокета перед выдачой Bind вызова. Обратите внимание, что параметр интерпретируется только во время Bind вызова: поэтому не требуется (но безвредно), чтобы задать параметр в сокете, который не должен быть привязан к существующему адресу, и установка или сброс параметра после Bind вызова не влияет на этот или любой другой сокет.

Приложение может запросить, чтобы реализация сокетов Windows разрешала использование пакетов "сохраняйте работоспособность" для подключений протокола TCP, включив параметр сокета SO_KEEPALIVE . Реализация сокетов Windows не должна поддерживать использование сохраняемых данных: если это делается, то точную семантику зависят от реализации, но должны соответствовать разделу 4.2.3.6 RFC 1122: "Требования к узлам Интернета — уровни коммуникации". Если подключение удаляется в результате "поддержания активности", код WSAENETRESET ошибки возвращается ко всем вызовам, выполняемым в сокете, и все последующие вызовы завершаются ошибкой WSAENOTCONN.

Параметр TCP_NODELAY отключает алгоритм Nagle. Алгоритм Nagle используется для уменьшения количества небольших пакетов, отправленных узлом, буферизируя ненауправляемые данные отправки, пока не будет отправлен полный размер пакета. Однако для некоторых приложений этот алгоритм может препятствовать производительности и TCP_NODELAY может использоваться для отключения. Записи приложений не должны задаваться TCP_NODELAY , если влияние этого не является понятным и необходимым, так как настройка TCP_NODELAY может оказать значительное негативное влияние на производительность сети. TCP_NODELAY — единственный поддерживаемый параметр сокета, который использует уровень IPPROTO_TCP; все остальные параметры используют уровень SOL_SOCKET.

Некоторые реализации сокетов Windows предоставляют выходные данные отладки, если SO_DEBUG параметр задан приложением.

Для следующих параметров поддерживаются SetSockOpt. Тип определяет тип данных, адресуемых lpOptionValue.

Значение Тип Значение
SO_BROADCAST BOOL Разрешить передачу широковещательных сообщений в сокете.
SO_DEBUG BOOL Записать отладочную информацию.
SO_DONTLINGER BOOL Не блокируйте Close отправку неотступных данных. Установка этого параметра эквивалентна настройке SO_LINGER с l_onoff равным нулю.
SO_DONTROUTE BOOL Не маршрутив: отправляйте непосредственно в интерфейс.
SO_KEEPALIVE BOOL Отправить в живых.
SO_LINGER struct LINGER Linger on Close if unsent data is present.
SO_OOBINLINE BOOL Получение внеполосных данных в обычном потоке данных.
SO_RCVBUF int Укажите размер буфера для получения.
SO_REUSEADDR BOOL Разрешить сокету привязаться к адресу, который уже используется. (См. раздел Bind.)
SO_SNDBUF int Укажите размер буфера для отправки.
TCP_NODELAY BOOL Отключить алгоритм Nagle для отправки объединенных пакетов.

Параметры распространения программного обеспечения Berkeley (BSD) не поддерживаются SetSockOpt :

Значение Тип Значение
SO_ACCEPTCONN BOOL Сокет прослушивает
SO_ERROR int Получение состояния ошибки и очистка.
SO_RCVLOWAT int Получение низкой водяной отметки.
SO_RCVTIMEO int Время ожидания получения
SO_SNDLOWAT int Отправка низкой водяной отметки.
SO_SNDTIMEO int Время ожидания отправки.
SO_TYPE int Тип сокета.
IP_OPTIONS Задайте поле параметров в заголовке IP-адресов.

CAsyncSocket::ShutDown

Вызовите эту функцию-член, чтобы отключить отправку, получение или оба в сокете.

BOOL ShutDown(int nHow = sends);

Параметры

nHow
Флаг, описывающий, какие типы операций больше не будут разрешены, используя следующие перечисленные значения:

  • receives = 0

  • sends = 1

  • оба = 2

Возвращаемое значение

Ненулевое значение, если функция выполнена успешно; в противном случае 0 и определенный код ошибки можно получить путем вызова GetLastError. Следующие ошибки применяются к этой функции-члену:

  • WSANOTINITIALISED Перед использованием этого API необходимо выполнить успешное AfxSocketInit выполнение.

  • WSAENETDOWN Реализация сокетов Windows обнаружила, что сетевая подсистема завершилась ошибкой.

  • Недопустимый параметр WSAEINVALnHow.

  • WSAEINPROGRESS Выполняется блокировка операции сокетов Windows.

  • WSAENOTCONN Сокет не подключен (SOCK_STREAM только).

  • WSAENOTSOCK Дескриптор не является сокетом.

Замечания

ShutDown используется для всех типов сокетов для отключения приема, передачи или обоих типов. Если nHow значение равно 0, последующие получение в сокете будет запрещено. Это не влияет на более низкие уровни протокола.

Для протокола управления передачей (TCP) окно TCP не изменяется, а входящие данные будут приняты (но не подтверждены), пока окно не будет исчерпано. Для протокола пользовательской обработки данных (UDP) входящие диаграммы данных принимаются и помещаются в очередь. В случае не будет создаваться пакет ошибки ICMP. Если nHow значение равно 1, последующие отправки запрещены. Для сокетов TCP будет отправлен FIN. Параметр nHow 2 отключает отправку и получение, как описано выше.

Обратите внимание, что ShutDown не закрывает сокет, а ресурсы, подключенные к сокету, не будут освобождены до вызова Close . Приложение не должно полагаться на возможность повторного использования сокета после его завершения. В частности, реализация сокетов Windows не требуется для поддержки использования Connect такого сокета.

Пример

Пример см. в примере CAsyncSocket::OnReceive.

CASyncSocket::Socket

Выделяет дескриптор сокета.

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

Параметры

nSocketType
Указывает SOCK_STREAM или SOCK_DGRAM.

lEvent
Битовая маска, указывающая сочетание сетевых событий, в которых заинтересовано приложение.

  • FD_READ: хотите получать уведомление о готовности к чтению.

  • FD_WRITE: хотите получать уведомление о готовности к написанию.

  • FD_OOB: хотите получать уведомление о поступлении данных вне диапазона.

  • FD_ACCEPT: требуется получать уведомления о входящих подключениях.

  • FD_CONNECT: требуется получать уведомления о завершенных подключениях.

  • FD_CLOSE: хотите получать уведомление о закрытии сокета.

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

nAddressFormat
Спецификация семейства адресов.

Возвращаемое значение

Возвращает успешность TRUE при FALSE сбое.

Замечания

Этот метод выделяет дескриптор сокета. Он не вызывает CAsyncSocket::Bind привязку сокета к указанному адресу, поэтому необходимо вызвать Bind позже, чтобы привязать сокет к указанному адресу. Можно использовать CAsyncSocket::SetSockOpt для задания параметра сокета перед его привязкой.

См. также

CObject Класса
Диаграмма иерархии
CSocket Класса
CSocketFile Класса