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


Функция обратного вызова 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

Необязательный указатель на буфер, который получает адрес подключающейся сущности, как известно поставщику услуг. Точный формат параметра addr определяется семейством адресов, установленным при создании сокета в структуре sockaddr .

[in, out] addrlen

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

[in] lpfnCondition

Адрес экземпляра процедуры функции необязательных условий, предоставляемой Windows Sockets. Эта функция используется в решении о принятии или отклонении на основе сведений о вызывающем объекте, переданных в качестве параметров.

[in] dwCallbackData

Данные обратного вызова, передаваемые обратно клиенту сокета Windows 2 в качестве значения параметра dwCallbackData функции условия. Этот параметр не интерпретируется поставщиком услуг.

[out] lpErrno

Указатель на код ошибки.

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

Если ошибка не возникает, LPWSPAccept возвращает значение типа SOCKET, которое является дескриптором для принятого сокета. В противном случае возвращается значение INVALID_SOCKET, а в lpErrno доступен определенный код ошибки.

Код ошибки Значение
WSAECONNREFUSED
Запрос на подключение был принудительно отклонен, как указано в возвращаемом значении функции условия (CF_REJECT).
WSAECONNRESET
Входящее подключение было указано, но впоследствии было прервано удаленным одноранговым узелом перед принятием вызова.
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEFAULT
Параметр addrlen слишком мал или параметр lpfnCondition не является частью адресного пространства пользователя.
WSAEINTR
Вызов (блокирующий) был отменен через LPWSPCancelBlockingCall.
WSAEINPROGRESS
Выполняется блокирующий вызов сокетов Windows.
WSAEINVAL
LPWSPListen не был вызван до LPWSPAccept, параметр g , указанный в функции условия, не является допустимым значением, возвращаемое значение функции условия не является допустимым или в любом случае, когда указанный сокет находится в недопустимом состоянии.
WSAEMFILE
Очередь не является непустой при входе в LPWSPAccept, и дескрипторы сокета недоступны.
WSAENOBUFS
Нет свободного места в буфере.
WSAENOTSOCK
Дескриптор не является сокетом.
WSAEOPNOTSUPP
Указанный сокет не является типом, поддерживающим службу, ориентированную на подключение.
WSATRY_AGAIN
Принятие запроса на подключение было отложено, как указано в возвращаемом значении функции условия (CF_DEFER).
WSAEWOULDBLOCK
Сокет помечается как неблокировка, и подключения не принимаются.
WSAEACCES
Время ожидания запроса на подключение истекло или было отозвано.

Комментарии

Функция LPWSPAccept извлекает первое подключение в очереди ожидающих подключений в сокетах и проверяет его на соответствие функции условия при условии, что указана функция условия (т. е. не null). Функция условия должна выполняться в том же потоке, что и эта подпрограмма. Если функция condition возвращает CF_ACCEPT, LPWSPAccept создает новый сокет.

Новые сокеты имеют те же свойства, что и сокеты, включая сетевые события, зарегистрированные с помощью LPWSPAsyncSelect или LPWSPEventSelect. Как описано в разделе DescriptorAllocation, при выделении новых дескрипторов сокетов поставщики IFS должны вызывать WPUModifyIFSHandle , а поставщики, отличные от IFS, должны вызывать WPUCreateSocketHandle.

Если функция condition возвращает CF_REJECT, LPWSPAccept отклоняет запрос на подключение. Если решение о принятии или отклонении приложения не может быть принято немедленно, функция условия вернет CF_DEFER, чтобы указать, что решение не было принято. Поставщик услуг не должен выполнять никаких действий в отношении этого запроса на подключение. Когда приложение будет готово к выполнению действия с запросом на подключение, оно снова вызовет LPWSPAccept и вернет CF_ACCEPT или CF_REJECT в качестве значения, возвращаемого функцией условия.

Для сокетов, которые находятся в режиме блокировки (по умолчанию), если в очереди нет ожидающих подключений, LPWSPAccept блокирует вызывающий объект до тех пор, пока не будет установлено подключение. Для сокетов в режиме без блокировки, если эта функция вызывается при отсутствии ожидающих подключений в очереди, LPWSPAccept возвращает код ошибки WSAEWOULDBLOCK. Допустимый сокет нельзя использовать для приема дополнительных подключений. Исходный сокет остается открытым.

Надстройка параметров — это результирующий параметр, который заполняется адресом подключающейся сущности, как известно поставщику услуг. Точный формат параметра addr определяется семейством адресов, в котором происходит обмен данными. Addrlen является параметром значения и результата; Изначально он будет содержать объем пространства, на который указывает addr. При возврате он должен содержать фактическую длину (в байтах) адреса, возвращенного поставщиком услуг. Этот вызов используется с типами сокетов, ориентированными на подключение, такими как SOCK_STREAM. Если аргумент addr и (или ) addrlen равен null, то сведения об удаленном адресе принятого сокета не возвращаются. В противном случае эти два параметра должны быть заполнены независимо от того, указана ли функция условия или что она возвращает.

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

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. Многие сетевые протоколы не поддерживают данные вызывающего абонента во время подключения. Ожидается, что большинство обычных сетевых протоколов будут поддерживать сведения об идентификаторе вызывающего абонента во время запроса подключения. Часть BufWSABUF , на которую указывает lpCallerId , указывает на sockaddr. Sockaddr интерпретируется в соответствии с его семейством адресов (как правило, путем приведения sockaddr к определенному типу, относямуся к семейству адресов).

Параметр lpSQOS ссылается на спецификации потока для сокетов, указанных вызывающим объектом, по одному для каждого направления, за которым следуют все дополнительные параметры, зависящие от поставщика. Значения спецификации потока отправки или получения будут игнорироваться для любых однонаправленных сокетов. Значение NULL для lpSQOS указывает на отсутствие качества обслуживания, предоставляемого вызывающим абонентом, и что согласование невозможно. Указатель lpSQOS, отличный от NULL, указывает, что будет выполнено согласование качества обслуживания или что поставщик готов принять запрос QoS без согласования.

lpCalleeId — это параметр значения, содержащий локальный адрес подключенной сущности. Часть BufWSABUF , на которую указывает lpCalleeId , указывает на sockaddr. Sockaddr интерпретируется в соответствии с его семейством адресов (как правило, путем приведения sockaddr к определенному типу, относямуся к семейству адресов).

lpCalleeData — это результирующий параметр, используемый функцией условия для передачи пользовательских данных в подключающуюся сущность. Хранилище этих данных должно быть предоставлено поставщиком услуг. lpCalleeData-len> изначально содержит длину буфера, выделенного поставщиком услуг и на который указывает lpCalleeData-buf>. Нулевое значение означает, что передача пользовательских данных обратно вызывающей стороне не поддерживается. Функция условия копирует данные в lpCalleeData-len> в байты данных в lpCalleeData-buf>, а затем обновитlpCalleeData-len>, чтобы указать фактическое количество переданных байтов. Если данные пользователя не должны передаваться вызывающей стороне, функция условия установит для lpCalleeData-len> значение 0. Формат всех данных адреса и пользователя зависит от семейства адресов, к которому принадлежит сокет.

Значение параметра dwCallbackData , передаваемое функции condition, является значением, передаваемым в качестве параметра dwCallbackData в исходном вызове LPWSPAccept . Это значение интерпретируется только клиентом Windows Sockets 2. Это позволяет клиенту передавать некоторые сведения контекста с сайта вызова LPWSPAccept в функцию условия, которая предоставляет функции условия любые дополнительные сведения, необходимые для определения того, следует ли принимать подключение. Обычно используется передача указателя (подходящего приведения) на структуру данных, содержащую ссылки на определяемые приложением объекты, с которыми связан этот сокет.

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header ws2spi.h

См. также раздел

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket