server只有通过定时向client发包看有没有回应,没有回应就知道client退出了

解决方案 »

  1.   

    if(recv(...) == 0){
       printf("client closed\n");
    }
      

  2.   

    如果用的是MFC,会响应OnClose消息(其实还是FD_CLOSE消息)。如果是用的API,你的窗口过程会收到FD_CLOSE消息。
      

  3.   

    不用一直发数据包可以做到吗?
    我用的是api
      

  4.   

    在Client调用CAsyncSocket::OnClose能得到Server关闭的消息
    在Server调用CAsyncSocket::OnClose能得到Client关闭的消息
      

  5.   

    client端用shutdown()才有Server端才会收到FD_CLOSE
    没有的话,那套接字出错有可能就是client端关闭了。
      

  6.   

    select语句怎么用?
    有谁能详细介绍一下么?
      

  7.   

    int setsockopt(
      SOCKET s,                 
      int level,                
      int optname,              
      const char FAR *optval,  
      int optlen                
    );
    用setsockopt设置SOL_SOCKET的SO_KEEPALIVE选项
      

  8.   

    你说的直接关闭client,究竟是指什么意思?
    是结束client程序?还是运行client程序的电脑被关机?
    如果是正常关闭,对方会收到FD_CLOSE。异常情况,对方不会知道,直到他需要和另一方通信,发送了数据之后会收到RST,才知道对方已经关闭了。
    正常情况,只要程序考虑到了,就没问题。
    异常情况,必须要使用额外的手段,如果你的通信经常有数据交互,就不用担心这个;如果中间可能停止很长一段时间没有数据交互,那么可以使用一些数据来询问对方,希望回答,确认连接没问题。
    楼上的方法是打开保活计数器,但是并不推荐使用。
      

  9.   

    关闭client关闭问题我已经明白了,谢谢大家了。
    现在是这样的:我的程序是跟php网页通过socket交互的,php里有一个函数是socket_select
    原文:
    socket_select -- Runs the select() system call on the sets mentioned with a timeout specified by tv_sec and tv_usec int socket_select ( resource read_fd, resource write_fd, resource except_fd, int tv_sec [, int tv_usec])
    没找到其它更详细的文档了,看得不大清楚,所以想问问关于socket中select的用法!
      

  10.   

    专门用一个线程来监视CLIENT,隔一段时间就往client发包
      

  11.   

    阻塞的socket send/recv返回错误码(<=0)就可以认为close了