|
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:
- 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.
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
accept, bind, connect, getsockopt, listen, select, socket, WSAAsyncSelect, WSAConnect
Related Links
Software for Delphi and C++ Builder developers
Software for Visual Studio .NET developers
Software for Visual Basic 6 developers
Delphi Tips&Tricks
MegaDetailed.NET
More Online Helps
Win32 Programmer's Reference (win32.hlp)
Win32 Multimedia Programmer's Reference (mmedia.hlp)
OLE Programmer's Reference (ole.hlp)
Microsoft Windows Pen API Programmer's Reference (penapi.hlp)
Microsoft Windows Telephony API (TAPI) Programmer's Reference (tapi.hlp)
Unix Manual Pages
|