ioctl函数

 ioctl函数用于在套接字上控制套接字的I/O行为,同时获取与套接字挂起的I/O操作的有关信息。

1)第一个ioctl函数是ioctlsocket,其起源于Winsock 1规范,其定义如下:

int ioctlsocket(
  SOCKET s,
  long cmd,
  u_long FAR*  argp;
);
  • s:为要进行I/O操作的套接字描述符。
  • cmd:一个预定义的标志,用在将执行的I/O控制命令上。
  • 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错误可以广播到套接字

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(网络编程)