Функция обратного вызова LPWSPACCEPT (ws2spi.h)
Функция LPWSPAccept условно принимает соединение на основе возвращаемого значения функции условия.
Синтаксис
LPWSPACCEPT Lpwspaccept;
SOCKET Lpwspaccept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] LPINT addrlen,
[in] LPCONDITIONPROC lpfnCondition,
[in] DWORD_PTR dwCallbackData,
[out] LPINT lpErrno
)
{...}
Параметры
[in] s
Дескриптор, определяющий сокет, прослушивающий подключения после LPWSPListen.
[out] addr
Необязательный указатель на буфер, который получает адрес подключаемой сущности, как известно поставщику услуг. Точный формат параметра надстройки определяется семейством адресов, установленным при создании сокета в структуре sockaddr.
[in, out] addrlen
Необязательный указатель на целое число, содержащее длину параметра надстройки в байтах.
[in] lpfnCondition
Адрес экземпляра процедуры функции необязательных условий, предоставляемой сокетами Windows. Эта функция используется в принятии или отклонении решения на основе информации вызывающего объекта, переданной в качестве параметров.
[in] dwCallbackData
Данные обратного вызова, передаваемые клиенту Windows Socket 2 в качестве значения параметра dwCallbackData функции условия. Этот параметр не интерпретируется поставщиком услуг.
[out] lpErrno
Указатель на код ошибки.
Возвращаемое значение
Если ошибка не возникает, LPWSPAccept возвращает значение типа SOCKET, которое является дескриптором для принятого сокета. В противном случае возвращается значение INVALID_SOCKET, а определенный код ошибки доступен в lpErrno.
Код ошибки | Значение |
---|---|
Запрос на подключение был принудительно отклонен, как указано в возвращаемом значении функции условия (CF_REJECT). | |
Входящие подключения были указаны, но впоследствии были завершены удаленным одноранговым узлом перед принятием вызова. | |
Сбой сетевой подсистемы. | |
Параметр addrlen слишком мал или параметр lpfnCondition не входит в адресное пространство пользователя. | |
Вызов (блокировка) был отменен через LPWSPCancelBlockingCall. | |
Выполняется блокировка вызова сокетов Windows. | |
LPWSPListen не был вызван до LPWSPAccept, параметр g, указанный в функции условия, не является допустимым, возвращаемое значение функции условия не является допустимым или в любом случае, если указанный сокет находится в недопустимом состоянии. | |
Очередь не является простой при входе в LPWSPAccept и нет дескрипторов сокетов. | |
Буферное пространство недоступно. | |
Дескриптор не является сокетом. | |
Ссылающийся сокет не является типом, поддерживающим службу, ориентированную на подключение. | |
Принятие запроса подключения было отложено, как указано в возвращаемом значении функции условия (CF_DEFER). | |
Сокет помечается как неблокировка и не принимается никаких подключений. | |
Предлагаемый запрос подключения истек или снят. |
Замечания
Функция
Только что созданные сокеты имеют те же свойства, что исокета
Если функция условия возвращает CF_REJECT, LPWSPAccept отклоняет запрос на подключение. Если решение о принятии или отклонении приложения не может быть принято немедленно, функция условия вернет CF_DEFER, чтобы указать, что решение не было принято. Никакие действия об этом запросе на подключение не должны приниматься поставщиком услуг. Когда приложение готово к выполнению действий по запросу подключения, оно вызовет LPWSPAccept снова и возвращает CF_ACCEPT или CF_REJECT в качестве возвращаемого значения из функции условия.
Для сокетов, находящихся в режиме блокировки (по умолчанию), если в очереди нет ожидающих подключений, LPWSPAccept блокирует вызывающий объект до тех пор, пока подключение не будет установлено. Для сокетов в режиме неблокировки, если эта функция вызывается при отсутствии ожидающих подключений в очереди, LPWSPAccept возвращает код ошибки WSAEWOULDBLOCK. Принятый сокет нельзя использовать для принятия дополнительных подключений. Исходный сокет остается открытым.
Параметр надстройки является результирующий параметр, заполненный адресом подключающейся сущности, как известно поставщику услуг. Точный формат параметра надстройки
Прототип функции условия выглядит следующим образом.
int CALLBACK
ConditionFunc(
IN LPWSABUF lpCallerId,
IN LPWSABUF lpCallerData,
IN OUT LPQOS lpSQOS,
IN OUT LPQOS lpGQOS,
IN LPWSABUF lpCalleeId,
IN LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD_PTR dwCallbackData
);
lpCallerId и lpCallerData — это параметры значений, которые должны содержать адрес подключаемой сущности и все пользовательские данные, отправленные вместе с запросом подключения. Если нет идентификатора вызывающего или вызывающего объекта, соответствующий параметр будет иметь значение NULL. Многие сетевые протоколы не поддерживают данные абонента во время подключения. Большинство обычных сетевых протоколов могут поддерживать сведения об идентификаторе вызывающего абонента во время запроса подключения. буф часть WSABUF указывает на lpCallerId указывает на sockaddr. sockaddr интерпретируется в соответствии с его адресной семьей (как правило, путем приведения sockaddr к определенному типу, конкретному семейству адресов).
Параметр
lpCalleeId — это параметр значения, содержащий локальный адрес подключенной сущности. буф часть WSABUF указывает на lpCalleeId указывает на sockaddr. sockaddr интерпретируется в соответствии с его адресной семьей (как правило, путем приведения sockaddr к определенному типу, конкретному семейству адресов).
lpCalleeData — это параметр результата, используемый функцией условия для предоставления пользовательских данных обратно в сущность подключения. Хранилище для этих данных должно предоставляться поставщиком услуг. lpCalleeData->len изначально содержит длину буфера, выделенного поставщиком услуг, и указывает на lpCalleeData->буф. Значение нуля означает, что передача пользовательских данных обратно вызывающей стороне не поддерживается. Функция условия будет копировать до lpCalleeData->len байт данных в lpCalleeData->buf, а затем обновить lpCalleeData->len, чтобы указать фактическое количество переданных байтов. Если пользовательские данные не передаются обратно вызывающей стороне, функция условия устанавливает lpCalleeData—>len равно нулю. Формат всех данных адреса и пользователя зависит от семейства адресов, к которому принадлежит сокет.
Значение параметра dwCallbackData, переданное функции условия, является значением, переданным в качестве параметра dwCallbackData в исходном вызове LPWSPAccept. Это значение интерпретируется только клиентом Windows Sockets 2. Это позволяет клиенту передавать некоторые сведения о контексте из LPWSPAccept через функцию условия, которая предоставляет функцию условия с дополнительными сведениями, необходимыми для определения того, следует ли принимать подключение. Обычное использование заключается в передаче указателя (подходящего приведения) в структуру данных, содержащую ссылки на определяемые приложением объекты, с которым связан этот сокет.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 2000 Профессиональный [только классические приложения] |
минимальный поддерживаемый сервер | Windows 2000 Server [только классические приложения] |
целевая платформа | Виндоус |
заголовка | ws2spi.h |