套接字模型

来源:互联网 发布:java语言是一种面向 编辑:程序博客网 时间:2024/05/06 08:37

  套接字I/O模型

1:Select模型

 Select模型是一种常见的模型,通过select函数来确定套接字状态。在网络应用程序中,通过一个线程来设计一个循环,不停的调用select函数,判断套接字上是否存在数据或者是否能够向套接字写入数据等

int select(int nfds,fd_set FAR *readfds, fd_set FAR *writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout)

          nfds:无实际意义

          readfds表示一组可读套接字

          writefds表示一组可写套接字

          exceptfds表示一组被检查有错误的套接字

          timeout表示函数的等待时间

 返回值:如果函数调用成功,在readfds,writefds、exceptfds参数中将存储满足条件的套接字元素,并且函数返回值为满足条件的套接字数量。如果函数调用超出了timeout设置的时间,返回值是0,如果函数调用失败,返回值是SOCKET_ERROR

  为了方便用户对fd_set类型的参数进行操作,VC++提供了四个宏

      1:FD_CLR(s, *set) :从集合中删除套接字

      2:FD_ISSET(s,*set):判断套接字s是否为集合set中的一员,如果是返回值为0,否则为0

      3:FD_SET(s,*set):向集合中添加套接字s

      4:FD_ZERO(*set):将集合set初始化为null;

下面一段代码判断套接字上是否有数据可读

   fd_set fdRead;  //定义一个fd_set对象

   FD_ZERO(&fdRead);   //初始化fdRead

   FD_SET(clientSock,&fdRead);  //将套接字clientSock添加到fdRead中

   if(select(0,&fdRead,NULL,NULL,NULL)>0) //调用select函数

    {

            If(FD_ISSET(clientSock,&fdRead)//判断clientSock是否是fdRead中一员

             {

                //从套接字中读取数据

              }

}

 

 

2:WSAAsyncSelect模型

   WSAAsyncSelect模型是WINSOWS系统基于消息的网络事件通知模型。当网络中有事件发生时,利用用户的连续请求,则应用程序中指定的窗口将会接受到一个消息,可以通过处理消息函数对网络中的事件进行处理。

  

    int WSAAsyncSelect(SOCKET s,HWND hwnd,unsigned int wMsg,long lEvent)

               Hwnd:表示接收消息的窗口句柄

              wMsg表示窗口接受来自套接字中的消息

              lEvent表示网络中发生的事

其中对于lEvent事件有

FD_READ :套接字中有数据读取时发送消息

FD_WRITE:当输出缓冲区可用区时发出消息

FD_OOB:套接字中有外带数据读取时发生消息

FD_ACCEPT:有连接请求时发出消息

FD_CONNECT:当连接完成后发出消息

FD_CLOSE:套接字关闭时发出消息

 

  下面通过一段代码描述WSAAsyncSelect模型的使用

  1:自定义一个消息

#define WM_SOCKER  WM_USER+20

  2:添加一个消息处理函数,用于处理网络中的事件

   LRESULT CDialogDlg::OnSocket(WPARAM wParam,LPARAM lParam)

{

    int nEvent=WSAGETSELECTEVENT(lParam);//读取网络18:40

    int nError=WSAGETSELECTERROR(lParam);//读取错误代码

    switch(nEvent)

    {

       case FD_CONNECT:……

       case FD_READ :……

         ……

     }

Return 0;

}

3:添加消息映射宏,将自定义消息与消息处理函数关联

  ON_MESSAGE(WM_SOCKET,OnSocket)

4:调用WSAAsyncSelect函数套接字模型

  int nRet=WSAAsyncSelect(clientSock,m_hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CONNECT);

  if(nRet!=0)

   {

          TRACE(“设置WSAAsyncSelect模型失败”);

   }