有人写过socket I/O模型中的事件模型(WSAEventSelect Model)的程序吗?
    我在用WSAEventSelect Model的时候出现了这个问题;
    当我的客户端连接服务器端的时候,服务器端的处于侦听的socket(Server)收到一个FD_ACCEPT消息,这是很正常的吧,因为有人要连接。但是紧接着,标识接入的客户端的socket(Client)也收到了一个消息:是FD_WRITE,按照我的代码,这样服务器端的代码就会向客户端send一些东西,但是这是我所不想要的呀!而我的客户端代码除了连接服务器之外什么都没有做。
    我想问的是:为什么会在标识客户端的socket上出现一个FD_WRITE消息吗?难道要向客户端发送什么吗?

解决方案 »

  1.   

    侦听的时候,得到新的套接字,wsaeventselect的时候不接受FD_WRITE,当第一次发送数据以后,在对该套接字使用wsaeventselect并对FD_WRITE感兴趣
      

  2.   

    FD_WRITE事件会在套接字空闲的时候自动引发,这样做的目的是为了更好的利用空闲时间,提高数据传输的效率
      

  3.   

    看一看FD_WRITE触发的几个条件
      

  4.   

    当产生新的套接字或发送数据时返回WSAEWOULDBLOCK错误的而过一段时间又可以发送数据的时候会自动产生FD_WRITE事件,楼主可以设置wsaeventselect不对fd_write感兴趣不就可以了。
      

  5.   

    有哪些事件可能会产生一个FD_WRITE消息呢?
      

  6.   

    我想问一下,是不是除了我们显示地调用SEND,RECEIVE等函数来收发数据之外,其实在服务器端和客户端之间还有一些数据的收发是不受我们控制的,或者说是暗含的?要不怎么会没有在SEND的时候也会在标识新连接的套接字上收到一个FD_WRITE消息呢?
      

  7.   

    出现时FD_WRITE表示可以向对等端发送数据。connect后马上收到这个消息很合乎逻辑啊
      

  8.   

    傻傻地问一下,这个FD_WRITE的消息是不是与TCP的三次握手相关的包呀?^_^
      

  9.   

    vtable9999(肝肝肝肝)
    FD_WRITE表示可以向对等端发送数据?
    那FD_WRITE还表示什么?
      

  10.   

    FD_WRITE在3种情况下被激发:
    (1)作为客户端的socket,当connect服务器成功后,就会激发FD_WRITE事件.我们可以利用这种机制,在异步连接服务器的情况下,判断客户端socket是否连接成功.
    (2)作为服务器通信socket(注意不是监听socket),当客户端socket第一次连接成功后,FD_WRITE便会被激发.同样我们也可以利用这种机制,知道有一个客户端已经连接完成,如果要向它发数据的话就可以发了.
    (3)第三种情况和TCP的滑动窗口有关,当发送socket不断填充发送缓冲区(不是应用层的),缓冲区满了返回WSAEWOULDBLOCK,此时应停止发送数据;当发送缓冲区可用了FD_WRITE事件便会激发,此时我们又可以调用send了.对第3种我理解地很浅(也不打算深入理解).
        个人感觉没有必要把FD_WRITE应用得很复杂,我以前用FD_WRITE机制实现了文件传输;为什么要用FD_WRITE呢,其实我不为什么就是觉得FD_WRITE挺有意思的.所以现在不用了.
      

  11.   

    HuangRG(IUnknownIsKernelCOM)
    我觉得你的理解好深刻呀,有没有这方面的详细资料呢?
    谢谢你的答复