今天打算写个小的网络运用程序;想用WSAAsyncSelect或者WSAEventSelect,查看资料后,知道比如说WSAAsyncSelect是把网络事件FD_ACCEPT,FD_READ,FD_WRITE,FD_CLOSE等跟某个windows 消息联系起来;
对于FD_ACCEPT和FD_CLOSE我倒是理解了,一有连接过来,马上触发FD_ACCEPT,一有连接断开,马上促发FD_CLOSE;可是对于FD_READ和FD_WRITE,什么情况下触发??FD_READ:是不是客户端一有数据送上来,马上就会触发?如果客户端先送一段数据,然后再送一段数据,是不是就促发两次FD_READ了??FD_WRITE:如果我程序里面没有调用send等发送函数,是不是就不会触发这个FD_WRITE了?我想估计是已经调用了send之类的函数后,才触发这个FD_WRITE的了,如果是这样的法,我在程序里面捕获FD_WRITE感觉意义不大了,因为我已经send了,再捕获FD_WRITE感觉就没什么用处了;我是个socket编程的新手,所以大家不要见笑啊。^-^。

解决方案 »

  1.   

    当有消息可读的时候 FD_READ
    当消息可以写的时候 FD_WRITE  比如连接成功后。发送成功后。
      

  2.   

    FD_READ事件触发条件:
    1.在数据到达socket后,并且从来没有触发过FD_READ(也就是最开始的阶段)
    2.在数据到达socket后,并且前一个recv()调用后
    3.调用recv()后,缓冲区还有未读完的数据第3点过程如下:
    1.100 bytes 数据到达,winsock2发出FD_READ
    2.程序用recv()只读入50 bytes,还剩下50 bytes
    3.winsock2继续发出FD_READ消息FD_WRITE事件触发条件:
    1.第一次connect()或accept()后(即连接建立后)
    2.调用send()返回WSAEWOULDBLOCK,并且直到发送缓冲区准备好(为空)后注意:当前一次调用send()没有返回WSAEWOULDBLOCK时,如果缓冲区准备好了,也不会触发FD_WRITE的
      

  3.   

    同意 MMC18,把分给他!
    楼主 是不是忘了!
      

  4.   

    对端socket关闭时好象也会FD_READ,这个时候调用recv时,返回是 0