基于WSAEventSelect模型,客户端连接请求或通过发送数据,在服务器这边可能得到FD_READ或FD_ACCEPT这些事件通知,如果向所有客户端发送数据的情况下,一个做法是对所有客户端的SOCKET进行send处理,那请问如何产生FD_WRITE事件通知呢,或在怎样的处理情况下才会发生FD_WRITE事件通知?
又假设理解为:通过服务器通过send函数将数据发送出去后,产生FD_WRITE事件通知,服务器通过该消息知道对客户端发送了什么数据,如果是这样的话,那FD_WRITE事件通知的作用不就是用来检查服务器对客户端发了哪些数据而已,是吗?请指教!
又假设理解为:通过服务器通过send函数将数据发送出去后,产生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。
首先,基于WSAEventSelect的模型,调用的send()函数不再是阻塞的,如果send()不能立即发送出去,则会马上返回,并返回一个错误码10035,即wsawouldblock的错误。这时,系统会在可以发送数据的时刻,给你发送FD_WRITE事件,这是你就可以在该事件下调用send()函数发送数据了。也就是说: 当满足下面条件后,套接口就会收到FD_WRITE消息,通知你,现在可以发送了:
1.在connect或者accept调用后,建立了连接.
2.上次的send或者sendto操作因为WSAEWOULDBLOCK失败,目前可能会成功