int WSAAPI WSAIoctl(SOCKET s,//一個套接口的句柄。
DWORD dwIoControlCode,//将進行的操作的控制代碼
LPVOID lpvInBuffer, //輸入緩沖區的位址
DWORD cbInBuffer,//輸出緩沖區的位址
LPVOID lpvOutBuffer, //輸入緩沖區的大小
DWORD cbOutBuffer, //輸出緩沖區的大小
LPDWORD lpcbBytesReturned,//輸出實際位元組數的位址
LPWSAOVERLAPPED lpOverlapped,//WSAOVERLAPPED結構的位址
LPWSAOVERLAPPED lpCompletionRoutine//一個指向操作結束後調用的例程指針
)
傳回值:
調用成功後,WSAIoctl ()函數傳回0。否則的話,将傳回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError()來擷取相應的錯誤代碼。
錯誤代碼:
WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAENETDOWN 網絡子系統失效。
WSAEINVAL cmd不是一個合法的指令;或者一個輸入參數非法;或者指令對于該種類型的套接口不适用。
WSAEINPROGRESS 在一個回調函數運作時調用了該函數。
WSAENOTSOCK 描述字不是一個套接口。
WSAEOPNOTSUPP 指定的ioctl指令無法實作,例如在SIO_SET_QOS或 SIO_SET_GROUP_QOS中指定的流描述無法實作。
WSA_IO_PENDING 一個重疊操作被成功啟動,過後将報告完成情況。
WSAEWOULDBLOCK 套接口标志為非阻塞,且所需操作将産生阻塞。
為什麼SIO_RCVALL=0x98000001 ?是有根據的。
在winsock2.h中定義了以下宏:
define IOC_VOID 0x20000000
define IOC_OUT 0x40000000
define IOC_IN 0x80000000
define IOC_UNIX 0x00000000
define IOC_WS2 0x08000000
define IOC_PROTOCOL 0x10000000
define IOC_VENDOR 0x18000000
define _WSAIO(x,y) (IOC_VOID|(x)|(y))
define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
define _WSAIOW(x,y) (IOC_IN|(x)|(y))
define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
裡面沒有SIO_RCVALL的定義,但是你可以檢視msdn中的ms-help://MS.MSDNQTR.2003FEB.2052/winsock/winsock/wsaioctl_2.htm看WSAIoctl函數中的SIO_RCVALL 的說明,你可以知道它是這樣定義的:
define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
即:
0x80000000|0x18000000|0x00000001=0x98000001
其中IOC_VENDOR 實際上是IOC_WS2|IOC_PROTOCOL ,因為要receive all IP packets on the network on win32 platform.