最近任务是要开发一个服务器。(客户端已经是很成熟的了。)采用异步socket方式。就是调用WSAAyncselect触发消息。问题:在正常通讯的过程中,服务器和客户端都未曾调用closesocket之类的操作。服务器仍然能每隔大概1分钟的时间,收到FD_CLOSE消息。请问这是什么原因???

解决方案 »

  1.   

    我在所有调用close的地方都打了断点 都没有调用的
      

  2.   

    FD_CLOSE: Only valid on connection-oriented sockets (for example, SOCK_STREAM) a. When WSAAsyncSelect called, if socket connection has been closed. b. After remote system initiated graceful close, when no data currently available to receive (Be aware that, if data has been received and is waiting to be read when the remote system initiates a graceful close, the FD_CLOSE is not delivered until all pending data has been read). c. After local system initiates graceful close with shutdown and remote system has responded with "End of Data" notification (for example, TCP FIN), when no data currently available to receive. 
    d. When remote system terminates connection (for example, sent TCP RST), and lParam will contain WSAECONNRESET error value. Note  FD_CLOSE is not posted after closesocket is called.
      

  3.   

    我用抓包工具 发现对方会发rst。
    但是我又怀疑是我引起的。
    我想请问一下:
    当对方发来的包长度为150时,而我第一次接收了44。根据WSAAyncselect的描述,WSA会自动触发第二次的FD_READ。而此时我却没有收到FD_READ,却收到了对方的rst。
    难道是我第一次没接收完,对方就rst了???
      

  4.   

    FD_CLOSE是在连接关闭时触发的消息,查看下SOCKET是否关闭,可能是accept的socket关了如果连接不断开,端口收到数据包会触发FD_READ看你的情况是不是网络环境不行,包也出错了,可能连接也不稳定
      

  5.   

    另外问一下  recv 的第三个参数 设置的很大很大 
    会有什么后果?
    会拷贝到不需要的数据么?
      

  6.   

    看你提供的buffer能不能容下了,如果buffer能容下的话,可能会读取到很多数据的。
    比如有数据111111222222233333
    你如果只想读取到3,但是你提供的buffer是32,则会读取所有的3到buffer中。
      

  7.   

    第三个参数是实际读取的包的长度,小了会收不全,buffer初始化了的话设大点也没问题
    来一个包会触发一个FD_READ消息 和参数无关
      

  8.   

     我用异步通讯的时候 发现如果recv的第三个参数len很长的话 可能会拷到TCP/IP头
    我觉得太神奇了...