to realdreamer(贫僧来了)我用的IOCP,用WSARecvFrom和MSG_PEEK收数据和地址可行,但是MSG_PEEK flag不会清空IOCP队列的数据,怎么版???
TO kimryo:MSDN 里面这么说: MSG_PEEK ... This flag is valid only for nonoverlapped sockets.MSG_PEEK 不能用于 重叠套接字. 你的是 IOCP , 就是要求创建重叠套接字了. 这样你也能成功调用吗? 另外, 为何要"检查"数据而不直接取出? 真的必须这么做吗 如果必须这么做, 我想是没有办法清空数据的. 必须再次以不带 MSG_PEEK 来调用才可清空.
WSARecvFrom
WSASendTo
系列函数调用结果简单说明. 1. 阻塞模式.
成功, 返回 0 , lpNumberOfBytesRecvd 参数指出发送或接收多少字节
失败, 返回 SOCKET_ERROR
2. 非阻塞模式
成功, 返回 0 , lpNumberOfBytesRecvd 参数指出发送或接收多少字节
失败 - 返回SOCKET_ERROR, WSAGetLastError==WSAEWOULDBLOCK, 不算失败. 以后可用 WSAEnumNetworkEvents 或 WaitXXX 或 接收消息确定结果; 返回 SOCKET_ERROR, WSAGetLastError!=WSAWOULDBLOCK. 调用失败3. 重叠模式.
返回 0 指明成功, lpNumberOfBytesRecvd 指出传输字节数.
返回 SOCKET_ERROR, 并且 WSAGetLastError==WSA_IO_PENDING, 在后来的 WSAGetOverlappedResult 或 完成例程 或 IOCP 中接收结果.
返回 SOCKET_ERROR, 并且 WSAGetLastError!=WSA_IO_PENDING, 调用失败.
另外, 为何要"检查"数据而不直接取出? 真的必须这么做吗
如果必须这么做, 我想是没有办法清空数据的. 必须再次以不带 MSG_PEEK 来调用才可清空.
ioctlsocket(sock, FIONREAD, &dwBytes);
// dwBytes 就是