Класс 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.
Этот класс основан на предположении, что вы понимаете сетевые связи. Вы отвечаете за обработку блокирующих, байтовых различий и преобразований между строками Юникода и многобайтового набора символов (MBCS). Если требуется более удобный интерфейс, который управляет этими проблемами для вас, см. класс CSocket
.
Чтобы использовать CAsyncSocket
объект, вызовите его конструктор, а затем вызовите Create
функцию, чтобы создать базовый дескриптор сокета (тип SOCKET
), за исключением принятых сокетов. Для сокета сервера вызывает Listen
функцию-член и для сокета клиента вызывает Connect
функцию-член. Сокет сервера должен вызывать Accept
функцию при получении запроса на подключение. Используйте остальные CAsyncSocket
функции для выполнения обмена данными между сокетами. По завершении удалите CAsyncSocket
объект, если он был создан в куче, деструктор автоматически вызывает Close
функцию. Тип SOCKET
данных описан в статье Сокеты Windows: Фон.
Примечание.
При использовании сокетов MFC в вторичных потоках в статическом приложении MFC необходимо вызвать AfxSocketInit
в каждом потоке, использующего сокеты для инициализации библиотек сокетов. По умолчанию AfxSocketInit
вызывается только в основном потоке.
Дополнительные сведения см. в статьях о сокетах Windows: использование классов CAsyncSocket
и связанных статей., а также API сокетов Windows 2.
Иерархия наследования
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.WSAEINVAL
Listen
не был вызван до принятия.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
Вызовите эту функцию-член, чтобы подключить дескриптор к объекту hSocket
CAsyncSocket
.
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, когда прослушивающий сокет создает сокет для использования в вызове, вы не вызываете Accept
Create
этот сокет.)
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
вызовы и при успешном выполнении вызовов Socket
Bind
для привязки сокета к указанному адресу. Поддерживаются следующие типы сокетов:
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_hSocket
NULL
.m_hSocket
SOCKET
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_KEEPALIVE
SO_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 обнаружила, что сетевая подсистема завершилась ошибкой.WSAEINVAL
lCommand
не является допустимой командой или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
операцию, чтобы определить, остаются ли все данные. Если есть обычные данные, предшествующие "срочным" (внеполосным) данным, он будет получен в порядке. (Обратите внимание, что илиReceive
ReceiveFrom
никогда не будет смешивать внеполосные и обычные данные в одном вызове.) Параметр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
пытается продолжать функционировать рационально, если отсутствуют доступные порты (дескрипторы). Он будет принимать подключения до очистки очереди. Если порты становятся доступными, при возможности вызов Listen
Accept
или перезаполнение очереди до текущей или последней "невыполненной работы" и возобновление прослушивания входящих подключений.
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
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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.WSAEFAULT
lpSockAddr
ИлиlpBuf
параметры не являются частью адресного пространства пользователя, илиlpSockAddr
аргумент слишком мал (меньше размераSOCKADDR
структуры).WSAEINVAL
Недопустимое имя узла.WSAENETRESET
Подключение должно быть сброшено, так как реализация сокетов Windows удалена.WSAENOBUFS
Реализация сокетов Windows сообщает о взаимоблокировке буфера.WSAENOTCONN
Сокет не подключен (SOCK_STREAM
только).WSAENOTSOCK
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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.WSAEFAULT
lpSockAddr
ИлиlpBuf
параметры не являются частью адресного пространства пользователя, илиlpSockAddr
аргумент слишком мал (меньше размераSOCKADDR
структуры).WSAEINVAL
Недопустимое имя узла.WSAENETRESET
Подключение должно быть сброшено, так как реализация сокетов Windows удалена.WSAENOBUFS
Реализация сокетов Windows сообщает о взаимоблокировке буфера.WSAENOTCONN
Сокет не подключен (SOCK_STREAM
только).WSAENOTSOCK
Дескриптор не является сокетом.WSAEOPNOTSUPP
MSG_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 обнаружила, что сетевая подсистема завершилась ошибкой.WSAEFAULT
lpOptionValue
не находится в допустимой части адресного пространства процесса.WSAEINPROGRESS
Выполняется блокировка операции сокетов Windows.WSAEINVAL
nLevel
недопустимо, или сведения вlpOptionValue
недействительном состоянии.WSAENETRESET
Время ожидания подключения истекло приSO_KEEPALIVE
установке.WSAENOPROTOOPT
Параметр неизвестен или не поддерживается. В частности,SO_BROADCAST
не поддерживается для сокетов типаSOCK_STREAM
, аSO_DONTLINGER
,SO_KEEPALIVE
иSO_LINGER
SO_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 обнаружила, что сетевая подсистема завершилась ошибкой.WSAEINVAL
nHow
недопустимо.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
Класс