Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208819
  • 博文数量: 64
  • 博客积分: 2010
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-25 19:03
文章分类

全部博文(64)

文章存档

2013年(1)

2012年(9)

2011年(25)

2010年(7)

2009年(16)

2008年(6)

分类:

2008-03-19 15:18:45

    在event sock中,FD_READ很简单,当系统的sock缓冲区有数据时,就会发出FD_READ,此时我们就可以用read,WSArecv等去接收数据.
    FD_WRITE来说理解起来相对困难一些.激发FD_WRTTE有三种情况.
    1.作为客户端,当和服务器建立一个连接时,会激发FD_WRITE.
    2.作为服务器端,当接受到一个连接时,会激发FD_WRTTE.
    2.当系统sock缓冲区填满后,缓冲区有空闲时就会激发FD_WRITE.
 
    所以在用event select 时,应该如下写:
 
    ........
    BOOL  bSockIsBlocked; //sock是否被发送阻塞
 
    .....
    case FD_READ:
         recv(......);//接受
         ........     //根据接受的情况处理想发送的数据
         if(!bSockIsBlocked)
             while(1)
            {
             ret =send(....);  //若发送不阻塞就可以直接发送;
             if(ret ==SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
              {
                   bSockIsBlocked = TRUE;
                    break;
             }
           break;
    case FD_WRITE:
         bSockIsBlocked = FALSE;
         while(1)
            {
             ret =send(....);  //若发送不阻塞就可以直接发送;
             if(ret ==SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
              {
                   bSockIsBlocked = TRUE;
                    break;
             }
            break;
   ...................
 
         
 
 
 
 
 
 
 
阅读(673) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:摘抄: iocp proxy server

给主人留下些什么吧!~~