套接字重叠I/O模型

  


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那说明对方关闭插座了



套接字重叠I/O模型