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 /* no parameters */
define IOC_OUT 0x40000000 /* copy out parameters */
define IOC_IN 0x80000000 /* copy in parameters */

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.

///////////////////////////////////////////////////////////////// // 初始化Socket bool CIOCPModel::_InitializeListenSocket() { // AcceptEx 和 GetAcceptExSockaddrs 的GUID,用于导出函数指针 GUID GuidAcceptEx = WSAID_ACCEPTEX; GUID GuidGetAcceptExSockAddrs = WSAID_GETACCEPTEXSOCKADDRS; // 服务器地址信息,用于绑定Socket struct sockaddr_in ServerAddress; // 生成用于监听的Socket的信息 m_pListenContext = new PER_SOCKET_CONTEXT; // 需要使用重叠IO,必须得使用WSASocket来建立Socket,才可以支持重叠IO操作 m_pListenContext->m_Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); if (INVALID_SOCKET == m_pListenContext->m_Socket) { this->_ShowMessage("初始化Socket失败,错误代码: %d.\n", WSAGetLastError()); return false; } else { TRACE("WSASocket() 完成.\n"); } // 将Listen Socket绑定至完成端口中 if( NULL== CreateIoCompletionPort( (HANDLE)m_pListenContext->m_Socket, m_hIOCompletionPort,(DWORD)m_pListenContext, 0)) { this->_ShowMessage("绑定 Listen Socket至完成端口失败!错误代码: %d/n", WSAGetLastError()); RELEASE_SOCKET( m_pListenContext->m_Socket ); return false; } else { TRACE("Listen Socket绑定完成端口 完成.\n"); } // 填充地址信息 ZeroMemory((char *)&ServerAddress, sizeof(ServerAddress)); ServerAddress.sin_family = AF_INET; // 这里可以绑定任何可用的IP地址,或者绑定一个指定的IP地址 //ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY); ServerAddress.sin_addr.s_addr = inet_addr(m_strIP.GetString()); ServerAddress.sin_port = htons(m_nPort); // 绑定地址和端口 if (SOCKET_ERROR == bind(m_pListenContext->m_Socket, (struct sockaddr *) &ServerAddress, sizeof(ServerAddress))) { this->_ShowMessage("bind()函数执行错误.\n"); return false; } else { TRACE("bind() 完成.\n"); } // 开始进行监听 if (SOCKET_ERROR == listen(m_pListenContext->m_Socket,SOMAXCONN)) { this->_ShowMessage("Listen()函数执行出现错误.\n"); return false; } else { TRACE("Listen() 完成.\n"); } // 使用AcceptEx函数,因为这个是属于WinSock2规范之外的微软另外提供的扩展函数 // 所以需要额外获取一下函数的指针, // 获取AcceptEx函数指针 DWORD dwBytes = 0; if(SOCKET_ERROR == WSAIoctl

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值