Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс
Представляет сокет 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 |
Отключает и (или) Send вызовы Receive в сокете. |
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 |
Указывает дескриптор, подключенный к этому SOCKET объектуCAsyncSocket. |
Замечания
Класс 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.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, семантика CSocket влияет на параметры Close сокета и SO_LINGER.SO_DONTLINGER Дополнительные сведения см. в разделе "Функция-член 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
Вызовите эту функцию-член, чтобы отсоединить дескриптор в элементе SOCKET данных от объекта и задать значение m_hSocketCAsyncSocket.m_hSocketNULL
SOCKET Detach();
CAsyncSocket::FromHandle
Возвращает указатель на CAsyncSocket объект.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Параметры
hSocket
Содержит дескриптор сокета.
Возвращаемое значение
Указатель на CAsyncSocket объект или NULL объект, к которому не CAsyncSocket подключен hSocketобъект.
Замечания
При указании дескриптора, если SOCKET объект не присоединен к дескрипторуCAsyncSocket, функция-член возвращается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. Параметр использует уровеньTCP_NODELAY; все остальные IPPROTO_TCP параметры используют уровень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 определить, остаются ли все больше внеполновые данные считываемыми.
lpSockAddr Параметры lpSockAddrLen игнорируются для 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 определить, остаются ли все больше внеполновые данные считываемыми.
lpSockAddr Параметры lpSockAddrLen игнорируются для 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.WSAEFAULTlpBufИлиlpSockAddrпараметры не являются частью адресного пространства пользователя, или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.WSAEFAULTlpBufИлиlpSockAddrпараметры не являются частью адресного пространства пользователя, или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Время ожидания подключения истекло при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 Класс