不错的select模型例子留着用



//*******************************就绪通告I/O模型**************************************
    ////

    //                 **************select模型***************
    //        
一个线程只能等待一个I/O操作
   //         select
能检测多个套接字上的多个操作
    // int select(
    //  int nfds,
    //  fb_set*readfbs,     fb_set
为套接字句柄的集合
    //  fb_set *writefbs,
    //  fb_set *exceptfbs,
    //  const timeval *timeout);

    // SOCKET sasocket;
     // fb_setfbread;                               
定义一个读数据的套接字的集合变量 fb
    // fb_setfbwrite;                                   

    // fb_setfbexcept                                 
异常
    // FD_SET(sasokcet,&fbexcept)
     // FD_SET(sasocket,&fbread);                
sasocket装入fbread集合中
    //  
    //  int err=0;
   //  if(FD_ISSET(sasocket,&fbexcept))            fbexcep
集合中sasocket是否发生异常
    //  {  
    //     int errlen=sizeof(err);
    // ****WSAGetLastError
针对当前线程********getsockopt针对一个具体的套接字******
    //     getsockopt(sasocket,
   //               SOL_SOCKET,         
选项定义的级别;仅支持的秩是SOL_SOCKET IPPROTO_TCP
   //                  SO_ERROR,              
该值将检索的套接字选项

    //               (CHAR*)&err,           
到所请求的选项的值将返回缓冲区的指针(返回值的地址)
   //                                       
对于SO_LINGER,这将是 LINGER 结构的大小
   //                                       
对于其他选项将是 BOOL int的范围,具体取决于选项卡

   //                  &errlen);            
lpOptionValue 缓冲区的大小的指针(以字节为单位)。
   
   //   if(err==WSAEWOULDBLOCK)      
   //                 ****************************************************************************
    ///
    //                       ******************WSAAsyncSelect模型******************
    //     int WSAAsyncSelect(
   //                  SOCKETs,
   //                  HWNDhwnd,
   //                  UINTwMsg,                  
自定义消息WM_USER+1
   //                  LONGlEvent);         
满足时通知线程  FD_CLOSE可以关闭FD_ACCEPT FD_WRITE FD_READ

    // *****wParam
套接字句柄
    //******* WSAGETSELECTERROR(lParam)
错误信息
    //******* WSAGETSELECTEVENT(lParam) I/O
操作信息
    //
当接到FD_WRITE消息后 会一直掉用send() 直到返回WSAEWOULDBLACK即没有可用的发送缓冲区
    //
消息循环...........
   //                  ***************************************************************************
    ///

    //                  ********************WSAEventSelect模型*********************
    //      intWSAEventSelect(           *****
将套接字句柄与事件关联****
   //                  SOCKET s,
   //                  WSAEVENT hEventObject,
   //                  LONG lEvents);
    //   WSAEVENT wsaEvent;
   //  WSACreateEvent   WSASetEvent   WSAResetEvent
    //      DWORDWSAWaitForMultipleEvents(                                 ***WSA_MAXIMUM_WAIT_EVENTS**64**
    //                             DWORDcEvents,                  
等待的事件内核对象数组的大小
   //                             constWSAEVENT FAR* lphEvents,     
事件内核对象数组的首地址
   //                             BOOLfWaitAll,
   //                             DWORDdwTimeout,              WSA_INFINITE
   //                             BOOLfAlertable);
    //*******fWaitAll=FALSE
   返回值-WSA_WAIT_EVENT_0表示的是出现的信号的事件在lpEvents中的索引值
   //                                               
当有多个事件出现信号时,   表示的是最前面的 索引值最小的出现信号的事件
    //***
为避免饿死   再次调用WSAWaitForMultipleEvents()指定等待时间为0**********
    //WSAWaitForMultipleEvents
错误则返回WSA_WAIT_FAILED
    //     if(return !=WSA_WAIT_FAILED)
    //        {
   //            intnEventIndex=return-WSA_WAIT_EVENT_0;
   //            if(nEventIndex==0)                                             ********
处理单个套接字的单个I/O操作
   //                 {
   //                     //
处理其他事件
   //                 ******WSAResetEvent(wsaEvent);   *****
没有自动重置*****
   //                  }
   //            else
   //               if(nEventIndex==1)
    //         }
   
/
   
//
   //           int  WSAEnumNetworkEvents(
   //                           SOCKET s,
   //                           WSAEVENT hEventObject,                           *******
处理单个套接字的多个I/O操作
   //                           LPWSANETWORKEVENTS lpNetworkEvents);
    //    WSANETWORKEVENTS wsanetworkevents;
    //
   //               strcutWSANETWORKEVENTS
   //                  {
   //                     longlNetworkEvents;           
可操作的I/O信息
   //                     int iErrorCode[FD_MAX_EVENTS];
   //                  }
   //            if(wsanetworkevents.lNetworkEvents& FD_READ)
   //              {
   //                          //
调用recv()            ******会自动重置*******
   //               }
   //            if(wsanetworkevents.iErrorCode[FD_READ_BIT]!=0)
   //               {
   //                       //
错误,不能调用recv()
   //                 }
   //************************************************************************************************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值