基于WSAEventSelect模型,客户端连接请求或通过发送数据,在服务器这边可能得到FD_READ或FD_ACCEPT这些事件通知,如果向所有客户端发送数据的情况下,一个做法是对所有客户端的SOCKET进行send处理,那请问如何产生FD_WRITE事件通知呢,或在怎样的处理情况下才会发生FD_WRITE事件通知?
又假设理解为:通过服务器通过send函数将数据发送出去后,产生FD_WRITE事件通知,服务器通过该消息知道对客户端发送了什么数据,如果是这样的话,那FD_WRITE事件通知的作用不就是用来检查服务器对客户端发了哪些数据而已,是吗?请指教!

解决方案 »

  1.   

    MARK下  最近也在用这个东西
      

  2.   

    FD_WRITE会在连接刚好建好时触发,也会在发送缓冲满后重新变为可用时触发。
      

  3.   

    FD_WRITE是在第一次发送缓冲可写的时候通知你的,如果不出现缓冲区满错误等,就不会再通知你FD_WRITE。
    一般把FD_WRITE作为一个标志来用,即收到FD_WRITE后将一个bool标志bCanSend置为true,在以后的send或sendto时先查bCanSend,看能否发送再进一步调send或sendto,在一次send或sendto失败(返回SOCKET_ERROR)后将bCanSend置为false,再收到FD_WRITE后再将bCanSend置为true。
      

  4.   

       我觉得上面说的都不太对,或解释的不太清楚。说说我的理解:
        首先,基于WSAEventSelect的模型,调用的send()函数不再是阻塞的,如果send()不能立即发送出去,则会马上返回,并返回一个错误码10035,即wsawouldblock的错误。这时,系统会在可以发送数据的时刻,给你发送FD_WRITE事件,这是你就可以在该事件下调用send()函数发送数据了。也就是说:   当满足下面条件后,套接口就会收到FD_WRITE消息,通知你,现在可以发送了:
       1.在connect或者accept调用后,建立了连接.
       2.上次的send或者sendto操作因为WSAEWOULDBLOCK失败,目前可能会成功