The WSPAccept function conditionally accepts a connection based on the return value of a condition function, and optionally creates or joins a socket group.
SOCKET WSPAccept (
SOCKET s,
struct sockaddr FAR * addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondition,
DWORD dwCallbackData,
LPINT lpErrno
);
The WSPAccept function extracts the first connection on the queue of pending connections on socket s, and checks it against the condition function, provided the condition function is specified (that is, not NULL). The condition function must be executed in the same thread as this routine. If the condition function returns CF_ACCEPT, WSPAccept creates a new socket and performs any socket grouping as indicated by the result parameter, g, in the condition function. Newly created sockets have the same properties as the socket s, including network events registered with WSPAsyncSelect or with WSPEventSelect, but not including the listening socket's group ID, if any. As is described Descriptor Allocation, when new socket descriptors are allocated IFS providers must call WPUModifyIFSHandle and non-IFS providers must call WPUCreateSocketHandle.
If the condition function returns CF_REJECT, WSPAccept rejects the connection request. If the application's accept/reject decision cannot be made immediately, the condition function will return CF_DEFER to indicate that no decision has been made. No action about this connection request is to be taken by the service provider. When the application is ready to take action on the connection request, it will invoke WSPAccept again and return either CF_ACCEPT or CF_REJECT as a return value from the condition function.
For sockets that are in the (default) blocking mode, if no pending connections are present on the queue, WSPAccept blocks the caller until a connection is present. For sockets in a nonblocking mode, if this function is called when no pending connections are present on the queue, WSPAccept returns the error code WSAEWOULDBLOCK as described below. The accepted socket cannot be used to accept more connections. The original socket remains open.
The argument addr is a result parameter that is filled with the address of the connecting entity, as known to the service provider. The exact format of the addr parameter is determined by the address family in which the communication is occurring. The addrlen is a value-result parameter; it will initially contain the amount of space pointed to by addr. On return, it must contain the actual length (in bytes) of the address returned by the service provider. This call is used with connection-oriented socket types such as SOCK_STREAM. If addr and/or addrlen are equal to NULL, then no information about the remote address of the accepted socket is returned. Otherwise, these two parameters shall be filled in regardless of whether the condition function is specified or what it returns.
The prototype of the condition function is as follows:
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 dwCallbackData
);
The lpCallerId and lpCallerData are value parameters that must contain the address of the connecting entity and any user data that was sent along with the connection request. If no caller ID or caller data is available, the corresponding parameter will be NULL. Many network protocols do not support connect-time caller data. Most conventional network protocols can be expected to support caller ID information at connection-request time. The buf part of the WSABUF pointed to by lpCallerId points to a SOCKADDR. The SOCKADDR is interpreted according to its address family (typically by casting the SOCKADDR to some type specific to the address family).
The lpSQOS parameter references the flow specifications for socket s specified by the caller, one for each direction, followed by any additional provider-specific parameters. The sending or receiving flow specification values will be ignored as appropriate for any unidirectional sockets. A NULL value for lpSQOS indicates that there is no caller supplied QOS and that no negotiation is possible. A non-NULL lpSQOS pointer indicates that a QOS negotiation is to occur or that the provider is prepared to accept the QOS request without negotiation.
Reserved for future use with socket groups: The lpGQOS parameter references the flow specifications for the socket group the caller is to create, one for each direction, followed by any additional provider-specific parameters. A NULL value for lpGQOS indicates no caller-supplied group QOS. QOS information can be returned if a QOS negotiation is to occur.
The lpCalleeId is a value parameter which contains the local address of the connected entity. The buf part of the WSABUF pointed to by lpCalleeId points to a SOCKADDR. The SOCKADDR is interpreted according to its address family (typically by casting the SOCKADDR to some type specific to the address family).
The lpCalleeData is a result parameter used by the condition function to supply user data back to the connecting entity. The storage for this data must be provided by the service provider. lpCalleeData->len initially contains the length of the buffer allocated by the service provider and pointed to by lpCalleeData->buf. A value of zero means passing user data back to the caller is not supported. The condition function will copy up to lpCalleeData->len bytes of data into lpCalleeData->buf, and then update lpCalleeData->len to indicate the actual number of bytes transferred. If no user data is to be passed back to the caller, the condition function will set lpCalleeData->len to zero. The format of all address and user data is specific to the address family to which the socket belongs.
Reserved for future use with socket groups: The result parameter g is assigned within the condition function to indicate the following actions:
if &g is an existing socket group ID, add s to this group, provided all the requirements set by this group are met; or
if &g = SG_UNCONSTRAINED_GROUP, create an unconstrained socket group and have s as the first member; or
if &g = SG_CONSTRAINED_GROUP, create a constrained socket group and have s as the first member; or
if &g = zero, no group operation is performed.
Any set of sockets grouped together must be implemented by a single service provider. For unconstrained groups, any set of sockets can be grouped together. A constrained socket group can consist only of connection-oriented sockets, and requires that connections on all grouped sockets be to the same address on the same host. For newly created socket groups, the new group ID must be available for the Windows Sockets SPI client to retrieve by calling WSPGetSockOpt with option SO_GROUP_ID. A socket group and its associated ID remain valid until the last socket belonging to this socket group is closed. Socket group IDs are unique across all processes for a given service provider.
The dwCallbackData parameter value passed to the condition function is the value passed as the dwCallbackData parameter in the original WSPAccept call. This value is interpreted only by the Windows Sockets 2 client. This allows a client to pass some context information from the WSPAccept call site through to the condition function, which provides the condition function with any additional information required to determine whether to accept the connection or not. A typical usage is to pass a (suitably cast) pointer to a data structure containing references to application-defined objects with which this socket is associated.
If no error occurs, WSPAccept returns a value of type SOCKET that is a descriptor for the accepted socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code is available in lpErrno.
WSAECONNREFUSED | The connection request was forcefully rejected as indicated in the return value of the condition function (CF_REJECT). |
WSAENETDOWN | The network subsystem has failed. |
WSAEFAULT | The addrlen argument is too small or the lpfnCondition is not part of the user address space. |
WSAEINTR | The (blocking) call was canceled through WSPCancelBlockingCall. |
WSAEINPROGRESS | A blocking Windows Sockets call is in progress. |
WSAEINVAL | WSPListen was not invoked prior to WSPAccept, parameter g specified in the condition function is not a valid value, the source address of the incoming connection request is not consistent with that of the constrained group the parameter g is referring to, the return value of the condition function is not a valid one, or any case where the specified socket is in an invalid state. |
WSAEMFILE | The queue is nonempty upon entry to WSPAccept and there are no socket descriptors available. |
WSAENOBUFS | No buffer space is available. |
WSAENOTSOCK | The descriptor is not a socket. |
WSAEOPNOTSUPP | The referenced socket is not a type that supports connection-oriented service. |
WSATRY_AGAIN | The acceptance of the connection request was deferred as indicated in the return value of the condition function (CF_DEFER). |
WSAEWOULDBLOCK | The socket is marked as nonblocking and no connections are present to be accepted. |
WSAEACCES | The connection request that was offered has timed out or been withdrawn. |
Windows NT: Yes
Windows: Yes
Windows CE: Unsupported.
Header: Declared in ws2spi.h.
WSPAccept, WSPBind, WSPConnect, WSPGetSockOpt, WSPListen, WSPSelect, WSPSocket, WSPAsyncSelect, WSPEventSelect