WSAIoctl
The Windows
Sockets WSAIoctl function controls the mode of a socket.
int WSAIoctl (
SOCKET s, |
|
DWORD dwIoControlCode, |
|
LPVOID lpvInBuffer, |
|
DWORD cbInBuffer, |
|
LPVOID lpvOUTBuffer, |
|
DWORD cbOUTBuffer, |
|
LPDWORD lpcbBytesReturned, |
|
LPWSAOVERLAPPED lpOverlapped, |
|
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE |
|
); |
|
Parameters
s
[in] Handle
to a socket
dwIoControlCode
[in] Control
code of operation to perform
lpvInBuffer
[in] Address
of input buffer
cbInBuffer
[in] Size of
input buffer
lpvOutBuffer
[out] Address
of output buffer
cbOutBuffer
[in] Size of
output buffer
lpcbBytesReturned
[out] Address
of actual bytes of output
lpOverlapped
[in] Address
of WSAOVERLAPPED structure
lpCompletionRoutine
[in] A
pointer to the completion routine called when the operation has been completed.
Remarks
This routine
is used to set or retrieve operating parameters associated with the socket, the
transport protocol, or the communications subsystem. For nonoverlapped socket, lpOverlapped
and lpCompletionRoutine parameters are ignored, and this function behaves
like the standard ioctlsocket function except that it may block if
socket s is in the blocking mode. Note that if socket s is in the
nonblocking mode, this function may return WSAEWOULDBLOCK if the specified
operation cannot be finished immediately. In this case, the application should
change the socket to the blocking mode and reissue the request. For overlapped
sockets, operations that cannot be completed immediately will be initiated, and
completion will be indicated at a later time. The final completion status is
retrieved through WSAGetOverlappedResult. The lpcbBytesReturned
parameter is ignored.
In as much as
the dwIoControlCode parameter is now a 32-bit entity, it is possible to
adopt an encoding scheme that preserves the currently defined ioctlsocket
opcodes while providing a convenient way to partition the opcode identifier
space. The dwIoControlCode parameter is architected to allow for
protocol and vendor independence when adding new control codes, while retaining
backward compatibility with the Windows Sockets 1.1 and Unix control codes. The
dwIoControlCode parameter has the following form:
3 |
3 |
2 |
2 2 |
2 2 2 2 2 2
2 1 1 1 1 |
1 1 1 1 1 1 |
1 |
0 |
9 |
8 7 |
6 5 4 3 2 1
0 9 8 7 6 |
5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0 |
I |
O |
V |
T |
Vendor/Address
Family |
Code |
I is set if the input buffer is valid for the code, as
with IOC_IN.
O is set if the output buffer is valid for the code, as
with IOC_OUT. Note that for codes with both input and output parameters,
both I and O will be set.
V is set if there are no parameters for the code, as
with IOC_VOID.
T is a two-bit quantity which defines the type of
ioctl. The following values are defined:
0 - The
ioctl is a standard Unix ioctl code, as with FIONREAD and FIONBIO.
1 - The
ioctl is a generic Windows Sockets 2 ioctl code. New ioctl codes defined for
Windows Sockets 2 will have T == 1.
2 - The
ioctl applies only to a specific address family.
3 - The
ioctl applies only to a specific vendor's provider. This type allows companies
to be assigned a vendor number which appears in the
Vendor/Address
family field, and then the vendor can
define new ioctls specific to that vendor without having to register the ioctl
with a clearinghouse, thereby providing vendor flexibility and privacy.
Vendor/Address
family - An 11-bit quantity which defines the vendor who owns
the code (if T == 3) or which contains the address family to which
the code applies (if T == 2). If this is a Unix ioctl code (T
== 0) then this field has the same value as the code on Unix. If this is
a generic Windows Sockets 2 ioctl (T == 1) then this field can be
used as an extension of the "code" field to provide additional code
values.
Code - The
specific ioctl code for the operation.
The following
Unix commands are supported:
Parameters
FIONBIO
Enable or
disable nonblocking mode on socket s. lpvInBuffer points at an unsigned
long, which is nonzero if nonblocking mode is to be enabled and zero if
it is to be disabled. When a socket is created, it operates in blocking mode
(that is, nonblocking mode is disabled). This is consistent with BSD sockets.
The WSAAsyncSelect
or WSAEventSelect routine automatically sets a socket to nonblocking
mode. If WSAAsyncSelect or WSAEventSelect has been issued on a
socket, then any attempt to use WSAIoctl to set the socket back to
blocking mode will fail with WSAEINVAL. To set the socket back to blocking
mode, an application must first disable WSAAsyncSelect by calling WSAAsyncSelect
with the lEvent parameter equal to zero, or disable WSAEventSelect
by calling WSAEventSelect with the lNetworkEvents parameter equal
to zero.
FIONREAD
Determine the
amount of data which can be read atomically from socket s. lpvOutBuffer
points at an unsigned long in which WSAIoctl stores the result.
If s is stream oriented (for example, type SOCK_STREAM), FIONREAD
returns the total amount of data which may be read in a single receive
operation; this is normally the same as the total amount of data queued on the
socket. If s is message oriented (for example, type SOCK_DGRAM),
FIONREAD returns the size of the first datagram (message) queued on the socket.
SIOCATMARK
Determine whether
or not all out-of-band data has been read. This applies only to a socket of
stream style (for example, type SOCK_STREAM) which has been configured for
in-line reception of any out-of-band data (SO_OOBINLINE). If no out-of-band
data is waiting to be read, the operation returns TRUE. Otherwise, it returns
FALSE, and the next receive operation performed on the socket will retrieve
some or all of the data preceding the "mark"; the application should
use the SIOCATMARK operation to determine whether any remains. If there is any
normal data preceding the "urgent" (out of band) data, it will be
received in order. (Note that receive operations will never mix out-of-band and
normal data in the same call.) lpvOutBuffer points at a BOOL in
which WSAIoctl stores the result.
The following
Windows Sockets 2 commands are supported:
Parameters
SIO_ASSOCIATE_HANDLE
(opcode setting: I, T==1)
Associate
this socket with the specified handle of a companion interface. The input
buffer contains the integer value corresponding to the manifest constant for the
companion interface (for example, TH_NETDEV and TH_TAPI.), followed by a value
which is a handle of the specified companion interface, along with any other
required information. Refer to the appropriate section in the Windows
Sockets 2 Protocol-Specific Annex for details specific to a particular
companion interface. The total size is reflected in the input buffer length. No
output buffer is required. The WSAENOPROTOOPT error code is indicated for
service providers which do not support this ioctl.
SIO_ENABLE_CIRCULAR_QUEUEING
(opcode setting: V, T==1)
Indicates to
the underlying message-oriented service provider that a newly arrived message
should never be dropped because of a buffer queue overflow. Instead, the oldest
message in the queue should be eliminated in order to accommodate the newly
arrived message. No input and output buffers are required. Note that this ioctl
is only valid for sockets associated with unreliable, message-oriented
protocols. The WSAENOPROTOOPT error code is indicated for service providers
which do not support this ioctl.
SIO_FIND_ROUTE
(opcode setting: O, T==1)
When issued,
this ioctl requests that the route to the remote address specified as a
sockaddr in the input buffer be discovered. If the address already exists in
the local cache, its entry is invalidated. In the case of Novell s IPX, this call initiates an IPX GetLocalTarget
(GLT), which queries the network for the given remote address.
SIO_FLUSH
(opcode setting: V, T==1)
Discards
current contents of the sending queue associated with this socket. No input and
output buffers are required. The WSAENOPROTOOPT error code is indicated for
service providers which do not support this ioctl.
SIO_GET_BROADCAST_ADDRESS
(opcode setting: O, T==1)
This ioctl
fills the output buffer with a sockaddr structure containing a suitable
broadcast address for use with sendto/WSASendTo.
SIO_GET_EXTENSION_FUNCTION_POINTER
(opcode setting: O, I, T==1)
Retrieve a
pointer to the specified extension function supported by the associated service
provider. The input buffer contains a globally unique identifier (GUID) whose
value identifies the extension function in question. The pointer to the desired
function is returned in the output buffer. Extension function identifiers are
established by service provider vendors and should be included in vendor
documentation that describes extension function capabilities and semantics.
SIO_GET_QOS
(opcode setting: O, T==1)
Retrieve the
QOS structure associated with the socket. The input buffer is optional. Some
protocols (for example, RSVP) allow the input buffer to be used to qualify a
QOS request. The QOS structure will be copied into the output buffer. The
output buffer must be sized large enough to be able to contain the full QOS
structure. The WSAENOPROTOOPT error code is indicated for service providers
which do not support QOS.
SIO_GET_GROUP_QOS
(opcode setting: O, I, T==1)
Retrieve the
QOS structure associated with the socket group to which this socket belongs.
The input buffer is optional. Some protocols (for example, RSVP) allow the
input buffer to be used to qualify a QOS request. The QOS structure will be
copied into the output buffer. If this socket does not belong to an appropriate
socket group, the SendingFlowspec and ReceivingFlowspec fields of
the returned QOS structure are set to NULL. The WSAENOPROTOOPT error code is
indicated for service providers which do not support QOS.
SIO_MULTIPOINT_LOOPBACK
(opcode setting: I, T==1)
Controls
whether data sent in a multipoint session will also be received by the same socket
on the local host. A value of TRUE causes loopback reception to occur while a
value of FALSE prohibits this.
SIO_MULTICAST_SCOPE
(opcode setting: I, T==1)
Specifies the
scope over which multicast transmissions will occur. Scope is defined as the
number of routed network segments to be covered. A scope of zero would indicate
that the multicast transmission would not be placed on the wire
but could be disseminated across sockets within the local host. A scope value
of one (the default) indicates that the transmission will be placed on the
wire, but will not cross any routers. Higher scope values determine the number
of routers that may be crossed. Note that this corresponds to the time-to-live
(TTL) parameter in IP multicasting.
SIO_SET_QOS
(opcode setting: I, T==1)
Associate the
supplied QOS structure with the socket. No output buffer is required, the QOS
structure will be obtained from the input buffer. The WSAENOPROTOOPT error code
is indicated for service providers which do not support QOS.
SIO_SET_GROUP_QOS (opcode setting: I, T==1)
Establish the
supplied QOS structure with the socket group to which this socket belongs. No
output buffer is required, the QOS structure will be obtained from the input
buffer. The WSAENOPROTOOPT error code is indicated for service providers which
do not support QOS, or if the socket descriptor specified is not the creator of
the associated socket group.
SIO_TRANSLATE_HANDLE
(opcode setting: I, O, T==1)
To obtain a
corresponding handle for socket s that is valid in the context of a
companion interface (for example, TH_NETDEV and TH_TAPI). A manifest constant
identifying the companion interface along with any other needed parameters are
specified in the input buffer. The corresponding handle will be available in
the output buffer upon completion of this function. Refer to the appropriate
section in the Windows Sockets 2 Protocol-Specific Annex for
details specific to a particular companion interface. The WSAENOPROTOOPT error
code is indicated for service providers which do not support this ioctl for the
specified companion interface.
If an
overlapped operation completes immediately, this function returns a value of
zero and the lpcbBytesReturned parameter is updated with the number of
bytes in the output buffer. If the overlapped operation is successfully
initiated and will complete later, this function returns SOCKET_ERROR and
indicates error code WSA_IO_PENDING. In this case, lpcbBytesReturned is
not updated. When the overlapped operation completes the amount of data in the
output buffer is indicated either through the cbTransferred parameter in
the completion routine (if specified), or through the lpcbTransfer
parameter in WSAGetOverlappedResult.
When called
with an overlapped socket, the lpOverlapped parameter must be valid for
the duration of the overlapped operation. The WSAOVERLAPPED structure has the
following form:
typedef struct _WSAOVERLAPPED {
DWORD Internal; // reserved
DWORD InternalHigh; // reserved
DWORD Offset; // reserved
DWORD OffsetHigh; // reserved
WSAEVENT hEvent;
} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;
If the lpCompletionRoutine
parameter is NULL, the hEvent field of lpOverlapped is signaled
when the overlapped operation completes if it contains a valid event object
handle. An application can use WSAWaitForMultipleEvents or WSAGetOverlappedResult
to wait or poll on the event object.
If lpCompletionRoutine
is not NULL, the hEvent field is ignored and can be used by the
application to pass context information to the completion routine.
The prototype
of the completion routine is as follows:
void
CALLBACK CompletionRoutine(
IN DWORD
dwError,
IN DWORD
cbTransferred,
IN LPWSAOVERLAPPED
lpOverlapped,
IN DWORD
dwFlags
);
CompletionRoutine is a placeholder for an application-defined or
library-defined function. dwError specifies the completion status for
the overlapped operation as indicated by lpOverlapped. cbTransferred
specifies the number of bytes returned. Currently there are no flag values
defined and dwFlags will be zero. This function does not return a value.
Returning
from this function allows invocation of another pending completion routine for
this socket. The completion routines may be called in any order, not
necessarily in the same order the overlapped operations are completed.
Compatibility
The ioctl
codes with T == 0 are a subset of the ioctl codes used in
Berkeley sockets. In particular, there is no command which is equivalent to
FIOASYNC.
Return Values
Upon
successful completion, the WSAIoctl returns zero. Otherwise, a value of
SOCKET_ERROR is returned, and a specific error code may be retrieved by calling
WSAGetLastError.
Error Codes
WSAENETDOWN |
The network
subsystem has failed. |
WSAEFAULT |
The lpvInBuffer,
lpvOutBuffer or lpcbBytesReturned argument is not totally
contained in a valid part of the user address space, or the cbInBuffer
or cbOutBuffer argument is too small. |
WSAEINVAL |
dwIoControlCode is not a valid command, or a supplied input
parameter is not acceptable, or the command is not applicable to the type of
socket supplied. |
WSAEINPROGRESS |
The
function is invoked when a callback is in progress. |
WSAENOTSOCK |
The
descriptor s is not a socket. |
WSAEOPNOTSUPP |
The
specified ioctl command cannot be realized. (For examle, the flow
specifications specified in SIO_SET_QOS or SIO_SET_GROUP_QOS cannot be
satisfied.) |
WSA_IO_PENDING |
An
overlapped operation was successfully initiated and completion will be
indicated at a later time. |
WSAEWOULDBLOCK |
The socket
is marked as nonblocking and the requested operation would block. |
See Also