ioctl函数用于在套接字上控制套接字的I/O行为,同时获取与套接字挂起的I/O操作的有关信息。
1)第一个ioctl函数是ioctlsocket,其起源于Winsock 1规范,其定义如下:
int ioctlsocket(
SOCKET s,
long cmd,
u_long FAR* argp;
);
2)在Winsock 2中增添的一个新的ioctl函数,该函数支持重叠I/O。该函数将argp分解为一系列输入参数和一系列输出参数。其定义如下:
int WSAIoctl(
SOCKET s,
DWORD dwIoControlCode,
LPVOID lpvInBuffer,
DWORD cbInBuffer,
LPVOID lpvOutBuffer,
DWORD cbOutBuffer,
LPWORD lpcbBytesReturned,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
s:为要进行I/O操作的套接字描述符。
dwIoControlCode:一个预定义的标志,用在将执行的I/O控制命令上。
lpvInBuffer:一个指针,指向输入的值。
cbInBuffer:输入数据的多少,以字节为单位。
lpvOutBuffer:一个指针,指向输出缓冲区。
cbOutBuffer:输出缓冲区的大小,以字节为单位。
lpcbBytesReturned:对应实际返回的字节数。
lpOverlapped和lpCompletionRoutine:这两个参数为重叠I/O的参数。
3)在windows xp中新增加了一个ioctl函数WSANSPIoctl,这个函数用来对命名空间提供程序作出I/O控制调用。
标准I/O控制命令
1)FIONBIO
函数:ioctlsocket、WSAIocal
输入:unsigned int
输出:无
说明:将套接字置为非阻塞模式。ioctlsocket调用的话,argp传入非零值,表示启用非阻塞模式,置为0,表示套接字将进入阻塞模式;如果使用WSAIoctl函数,只需对参数lpvInBuffer传入给定的无符号整数就可以了。
注意:如果使用了WSAAsyncSelect或WSAEventSelect函数后,如果想将套接字变为阻塞模式,应用程序首先必须禁止WSAAsyncSelect(lEvent置0)或WSAEventSelect(令lNetworkEvents等于0)。
2)FIONREAD
函数:ioctlsocket、WSAIocal
输入:无
输出:unsigned long
说明:返回在套接字上读取的数据量。ioctlsocket调用的话,包含打算读入的字节数。对于WSAIoctl函数,对于字节流的套接字,lpvOutBuffer参数返回,可读入的数据总量;对于面向消息的套接字,其返回套接字上排队的第一个消息的大小。
3)SIOCATMARK
函数:ioctlsocket、WSAIocal
输入:无
输出:BOOL
说明:判断是否已读取了OOB数据。若将一个套接字置为接收OOB数据,并且已置成已内嵌方式读取这种OOB数据,那么这个I/O控制命令就会返回一个布尔值,指出接下来是否准备接受OOB数据。如果是肯定的,则返回TRUE;否则,返回FALSE,而且下一次接收操作会返回OOB数据之前的所有或部分数据。
其他I/O控制命令
1)SIO_ENABLE_CIRCULAR_QUEUEING
函数:WSAIoctl
输入:BOOL
输出:BOOL
说明:如接收缓冲区溢出,则首先丢弃最先到达的消息。只是用与不可靠的,面向消息的协议。只是用于Windows NT平台。默认情况下,会丢掉后达到的消息。
2)SIO_FIND_ROUTE
函数:WSAIoctl
输入:SOCKADDR
输出:BOOL
说明:验证到指定地址的路由是否存在。目前没有windows支持。
3)SIO_FLUSH
函数:WSAIoctl
输入:无
输出:无
说明:丢掉发送缓冲区的数据。
4)SIO_GET_BROADCAST_ADDRESS
函数:WSAIoctl
输入:无
输出:SOCKADDR
说明:为套接字地址族返回一个广播地址。只是用于windows NT。
5)SIO_GET_EXTENSION_FUCTION_POINTER
函数:WSAIoctl
输入:GUID
输出:函数指针
说明:取得下层提供程序特有的函数指针。
6)SIO_CHK_QOS
函数:WSAIoctl
输入:DWORD
输出:DWORD
说明:检查指定套接字QQS属性。
7)SIO_GET_QOS
函数:WSAIoctl
输入:无
输出:QOS
说明:返回与套接字相关联的QOS结构。
8)SIO_SET_QOS
函数:WSAIotl
输入:QOS
输出:无
说明:为套接字设置QOS属性
9)SIO_MULTIPOINT_LOOPBACK
函数:WSAIoctl
输入:BOOL
输出:BOOL
说明:设置或调查多播数据是否循环返回到套接字。
10)SIO_MULTICAST_SCOPE
函数:WSAIoctl
输入:int
输出:int
说明:设置或获取多播数据的TTL值
11)SIO_KEEPLIVE_VALS
函数:WSAIoclt
输入:tcp_keeplive
输出:tcp_keeplive
说明:针对每个连接,分别为其“保持活跃”设置激活。
12)SIO_RCVALL
函数:WSAIoctl
输入:unsigned int
输出:无
说明:接收网络上的所有IPv4数据包。
13)SIO_RCVALL_MCAST
函数:WSAIoctl
输入:unsigned int
输出:无
说明:接收网络中的所有多播数据包
14)SIO_RCVALL_IGMPMCAST
函数:WSAIoctl
输入:unsigned int
输出:无
说明:接收网络中所有的IGMP数据包
15)SIO_ROUTING_INTERFACE_QUERY
函数:WSAIoctl、ioctlsocket
输入:SOCKADDR
输出:无
说明:返回向目标地址发送数据的本地接口
16)SIO_ROUTING_INTERFACE_CHANGE
函数:WSAIoctl
输入:SOCKADDR
输出:无
说明:与一个端点连接接口发生变化后,发出通知。
17)SIO_ADDRESS_LIST_QUERY
函数:WSAIoctl
输入:无
输出:SOCK_ADDRESS_LIST
说明:返回套接字能够绑定的接口列表
18)SIO_ADDRESS_LIST_SORT
函数:WSAIoctl
输入:SOCK_ADDRESS_LIST
输出:SOCK_ADDRESS_LIST
说明:按优先顺序对地址进行排序
19)SIO_ADDRESS_LIST_CHANGE
函数:WSAIoctl
输入:无
输出:无
说明:本地接口发生变化时,发送通知
20)SIO_GET_INTERFACE_LIST
函数:WSAIoctl
输入:无
输出:INTERFACE_INFO[]
说明:返回本地接口列表
21)SIO_GET_INTERFACE_LIST_EX
函数:WSAIoctl
输入:无
输出:INTERFACE_INFO_EX[]
说明:返回本地接口列表
22)SIO_GET_MULTICAST_FILTER
函数:WSAIoctl
输入:无
输出:struct ip_msfilter
说明:返回套接字上设置的多播筛选器
23)SIO_SET_MULTICAST_FILETER
函数:WSAIoclt
输入:struct ip_msfilter
输出:无
说明:在套接字上设置多播筛选器
24)SIO_INDEX_BIND
函数:WSAIoctl
输入:int
输出:无
说明:将套接字绑定到给定接口索引
25)SIO_INDEX_MCASTIF
函数:WSAIocltl
输入:int
输出:无
说明:将多播发送接口社会自到指定索引
26)SIO_INDEX_ADD_MCASTIF
函数:WSAIoctl
输入:struct ip_mreq
输出:无
说明:在指定索引上添加一个多播组
27)SIO_INDEX_DEL_MCAST
函数:WSAIoctl
输入:strcut ip_mreq
输出:无
说明:从指定索引撤销一个多播组
28)SIO_NSP_NOTIFY_CHANGE
函数:WSNSPIoctl
输入:无
输出:无
说明:当一个命名空间查询不再有效时发送
29)SIO_QUERY_TARGET_PNP_HANDLE
函数:WSAIoctl
输入:无
输出:SOCKET
说明:返回下层结构提供的SOCKET句柄
30)SIO_UDP_CONNRESET
函数:WSAIoctl
输入:BOOL
输出:无
说明:使ICMP错误可以广播到套接字