typedef struct _OVERLAPPED { ,,,ULONG_PTR 内部; ,,,ULONG_PTR InternalHigh; ,,,union { ,,,,,,,struct { ,,,,,,,,,,,DWORD 补偿; ,,,,,,,,,,,DWORD OffsetHigh; ,,,,,,,},DUMMYSTRUCTNAME; ,,,,,,,PVOID 指针; ,,,},DUMMYUNIONNAME; ,,,HANDLE , hEvent;,,//我们只要关注这个参数,,用来关联事件的 },重叠,,* LPOVERLAPPED;
int WSArecv ( ,,,SOCKET ,,//投递这个操作的套接字 ,,,LPWSABUF lpBuffer,//接收缓冲区,与Recv函数不同 ,,,LPDWORD lpNumberOfBytesRecvd,//如果接收操作立即完成,这里会返回函数调用 ,,,LPDWORD lpFlags,,//默认为0 ,,,LPWSAOVERLAPPER lpOverlapper,//绑定的重叠结构 ,,,LPWSAOVERLAPPER_COMPLETION_ROUTINE lpCompletionRoutine //一个回调 ,,,); ,,,返回值: ,,,WSA_IO_PENDING:常见返回值,说明WSARecv操作成功,但是I/O材质没完成,所以需要绑定一个事件来通知
,,DWORD WSAWaitForMultipleEvents ( ,,,,DWORD cEvents,,,,,,,,,,,,,,,,,,,,,,,,,//,等候事件的总数量 ,,,,const WSAEVENT *, lphEvents,,,,,,,,,,,,//,事件数组的指针 ,,,,BOOL fWaitAll,,,,,,,,,,,//,如果设置为真则事件中所有的事件被传信才返回,错误是当有事件立即返回 ,,,,DWORD dwTimeout,,,,,//,超时时间,如果超时,函数会返回,WSA_WAIT_TIMEOUT ,,,,//,如果设置为0,函数会立即返回,,//,如果设置为,WSA_INFINITE只有在某一个事件被传信后才会返回 ,,,,,,,BOOL fAlertable ,),,,,,//,默认用假的 返才能回值: ,,,WSA_WAIT_TIMEOUT :最常见的返回值,我们需要做的就是继续等待 ,,,WSA_WAIT_FAILED :,出现了错误,请检查cEvents和lphEvents两个参数是否有效
BOOL WSAGetOverlappedResult ( SOCKET 才能,,,,,,,,,,,,,,,,,,,,,//,插座,不用说了 LPWSAOVERLAPPED 才能;lpOverlapped,,,//,这里是我们想要查询结果的那个重叠结构的指针 LPDWORD 才能;lpcbTransfer,,,,,,//,本次重叠操作的实际接收(或发送)的字节数 BOOL 才能;fWait,,,,,,,,,,,,,,,,,//,设置为真的,除非重叠操作完成,否则函数不会返回 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,设置假,而且操作仍处于挂起状态,那么函数就会返回错误的 LPDWORD 才能;lpdwFlags ,,,,,,//,指向DWORD的指针,负责接收结果标志,, 第才能二个参数是输出的,,第三个参数也是输出的,就是你接收的字节数,为0那说明对方关闭插座了