CAsyncSocket::IOCtl

BOOL IOCtl( long lCommand, DWORD* lpArgument );

返回值:
调用成功时返回非零值,否则为0,并且可以调用GetLastError获取特定的错误代码。此成员函数可用的错误代码有:
·WSANOTINITIALISED调用本API函数之前必须成功地执行了AfxsockInit函数。
·WSAENETDOWNWindows Sockets检测到网络系统故障。
·WSAEINVALlCommand非法,或者lpArgument不是lCommand的合法参数,或者该命令不可执行这类套接字。
·WSAEINPROGRESS正在进行Windows Sockets块操作。
·WSAENOTSOCK描述符不是一个套接字。

参数:
lCommand要在套接字上执行的命令。
lpArgument指向lCommand所需参数的指针。

说明:
本函数用于控制套接字的模式。它可以用于任意状态、任意类型的套接字。本函数用于取得和套接字相关的操作参数,而与具体的通信协议和通信系统无关。它支持以下命令:
·FIONBIO允许或禁止套接字的非成块模式。lpArgument参数指向一个DWORD类型的值,如果允许非成块方式,则非零,否则为零。如果套接字上设置了AsyncSelect,试图调用IOCtl把套接字设回成块方式都会出错,错误信息为WSAEINVAL。要想正确地设回成块方式,必须先以参数lEvent=0调用AsyncSelect禁止AsyncSelect,然后调用IOCtl。
·FIONREAD检测一次Receive调用能从套接字中读出的最大字节数,结果就是lpArgument参数指向的一个DWORD类型的值。如果套接字的类型是SOCK_STREAM,FIONREAD返回一次Receive所能得到的数据总数,通常它和套接字队列中待取的数据大小一致。如果套接字的类型是SOCK_DGRAM,则FIONREAD返回套接字队列中的第一个数据报的大小。
·SIOCATMARK检测是否所有的带外数据都已经被读出。这只适用于设置成在线接收所有带外数据(SO_OOBINLINE)的SOCK_STREAM类型的套接字。如果没有带外数据在等待读取,则返回一个非零值,否则为0,并且在该套接字上的下一次Receive或ReceiveFrom将取出在某个标记(mark)之前的部分或所有数据,应用需要使用SIOCATMARK操作来判断是否还有数据。如果在“紧急”(带外)数据之前还有普通数据,它们还会按照正确的次序被依次接收(一次Receive或ReceiveFrom调用是不会同时取得普通数据和带外数据的)。本函数的调用结果存放在lpArgument参数指向的DWORD类型值中。
本函数在功能上是Berkeley套接字ioctl()的子集。没有和FIOASYNC对应的选项,而且SIOCATMARK是在套接字级别上支持的唯一命令。

请参阅:
CAsyncSocket::AsyncSelect, CAsyncSocket::Create, CAsyncSocket::GetSockOpt, CAsyncSocket::SetSockOpt