WSAAccept
The Windows
Sockets WSAAccept function conditionally accepts a connection based on
the return value of a condition function, and optionally creates and/or joins a
socket group.
SOCKET WSAAccept (
SOCKET s, |
|
struct
sockaddr FAR * addr, |
|
LPINT addrlen, |
|
LPCONDITIONPROC lpfnCondition, |
|
DWORD dwCallbackData |
|
); |
|
Parameters
s
[in] A
descriptor identifying a socket which is listening for connections after a listen.
addr
[out] An
optional pointer to a buffer which receives the address of the connecting
entity, as known to the communications layer. The exact format of the addr
argument is determined by the address family established when the socket was
created.
addrlen
[in/out] An
optional pointer to an integer which contains the length of the address addr.
lpfnCondition
[in] The
procedure instance address of the optional, application-supplied condition
function which will make an accept/reject decision based on the caller
information passed in as parameters, and optionally create and/or join a socket
group by assigning an appropriate value to the result parameter g of
this function.
dwCallbackData
[in] The
callback data passed back to the application as a condition function parameter.
This parameter is not interpreted by Windows Sockets.
Remarks
This routine
extracts the first connection on the queue of pending connections on s,
and checks it against the condition function, provided the condition function
is specified (that is, not NULL). If the condition function returns CF_ACCEPT,
this routine creates a new socket and performs any socket grouping as indicated
by the result parameter g in the condition function. The newly created
socket has the same properties as s including asynchronous events
registered with WSAAsyncSelect or with WSAEventSelect, but not
including the listening socket s group ID, if
any. If the condition function returns CF_REJECT, this routine rejects the
connection request. The condition function runs in the same thread as this
routine does, and should return as soon as possible. If the decision cannot be
made immediately, the condition function should return CF_DEFER to indicate that
no decision has been made, and no action about this connection request should
be taken by the service provider. When the application is ready to take action
on the connection request, it will invoke WSAAccept again and return
either CF_ACCEPT or CF_REJECT as a return value from the condition function.
For sockets
which remain in the (default) blocking mode, if no pending connections are
present on the queue, WSAAccept 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, WSAAccept returns an error
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 in with the address of the connecting
entity, as known to the communications layer. 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 should initially
contain the amount of space pointed to by addr. On return, it will
contain the actual length (in bytes) of the address returned. 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
will 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,
OUT LPWSABUF lpCalleeData,
OUT GROUP FAR * g,
IN DWORD dwCallbackData
);
ConditionFunc is a placeholder for the application-supplied
function name. In 16-bit Windows environments, it is invoked in the same thread
as WSAAccept, thus no other Windows Sockets functions can be called
except WSAIsBlocking and WSACancelBlockingCall. The actual
condition function must reside in a DLL or application module and be exported
in the module definition file. You must use MakeProcInstance to get a
procedure-instance address for the callback function.
The lpCallerId
and lpCallerData are value parameters which contain the address of
the connecting entity and any user data that was sent along with the connection
request, respectively. If no caller ID or caller data is available, the
corresponding parameters will be NULL.
lpSQOS 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 no caller supplied QOS. QOS information can
be returned if a QOS negotiation is to occur.
lpGQOS 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
lpCalleeData is a result parameter used by the condition function to
supply user data back to the connecting entity. 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 should
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 should set lpCalleeData->len to zero. The format
of all address and user data is specific to the address family to which the
socket belongs.
The result
parameter g is assigned within the condition function to indicate the
following actions:
1. if &g is an existing socket group
ID, add s to this group, provided all the requirements set by this group
are met; or
2. if &g = SG_UNCONSTRAINED_GROUP,
create an unconstrained socket group and have s as the first member; or
3. if &g = SG_CONSTRAINED_GROUP,
create a constrained socket group and have s as the first member; or
4. if &g = zero, no group operation is
performed.
For
unconstrained groups, any set of sockets can be grouped together as long as
they are supported by a single service provider. 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 can be retrieved by using getsockopt
with option SO_GROUP_ID, if this operation completes successfully. 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.
Return Values
If no error
occurs, WSAAccept returns a value of type SOCKET which is a descriptor
for the accepted socket. Otherwise, a value of INVALID_SOCKET is returned, and
a specific error code can be retrieved by calling WSAGetLastError.
The integer
referred to by addrlen initially contains the amount of space pointed to
by addr. On return it will contain the actual length in bytes of the
address returned.
Error Codes
WSANOTINITIALISED |
A successful
WSAStartup must occur before using this function. |
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 WSACancelBlockingCall. |
WSAEINPROGRESS |
A blocking
Windows Sockets 1.1 call is in progress. |
WSAEINVAL |
listen was not invoked prior to WSAAccept,
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 WSAAccept 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. |
See Also