天天看點

WSAIoctl

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.