我用MFC的CSocket做服务端程序,当跟客户端连接好后,我不主动接收数据,只是在客户端发过来数据后,在Socket的自动响应函数OnReceive()里用Receive()函数接收数据,请问大家,我这样做怎么才能知道客户端跟我断开连接。我试过了,断开以后Receive函数没有返回值的。

解决方案 »

  1.   

    VCKBASE里有一个MYQQ是用CSOCKET做的。比较全了,发送消息和文件
      

  2.   

    客户端端开了会有disconnected消息的
      

  3.   

    Overridable Notification FunctionsOnClose Notifies a socket that the socket connected to it has closed. 
    OnConnect Notifies a connecting socket that the connection attempt is complete, whether successfully or in error. 
      

  4.   

    1、如果是正常断开,即软件主动将socket Close的,你会收到消息,上面有说。
    2、非正常断线一般采用所谓的“心跳协议”,简单又实用。比如客户端一秒时间内发送一次在线信号。服务端设置一个变量i = 5 每隔1秒收不到信号就--i,如果i=0表示断线。如果收到信号将i=5,这样5秒为断线等待时间。
      

  5.   

    CSocket我不是很熟悉,我大喜欢这个东西好像它是没有办法处理非正常断开的情况,需要自己手动来处理,就是发送“心跳包”,楼上已经说得很详细了其实不如用现成的I/O模型,就可以很方便的处理非正常断开的情况了
      

  6.   

    使用心跳
    Client和Server定时握手
      

  7.   

    不行的,我的客户端是硬件设备,它一启动就要自动拨号登录到服务端,服务端只能是被动的接受它传过来的信号,所以只能这样做,但是服务端又必须知道它掉线状态。
    谁知道SELECT()怎么用,是不是那个可以做到我的要求?麻烦大家告诉我。
      

  8.   

    看书贝,书上讲解的很详细,关于select或者其它的io模型,呵呵!
      

  9.   

    TO: btbq(阿不) GetSockOptCall this member function to retrieve a socket option. GetSockOpt retrieves the current value for a socket option associated with a socket of any type, in any state, and stores the result in lpOptionValue. Options affect socket operations, such as the routing of packets, out-of-band data transfer, and so on.
    SELECT 能得到TCP连接的信息,但不能得到如拔网线等异常信息,若正常关闭,则SELECT可以得到CLOSE的消息。
    像你的情况,客户端是不能改的了,那就好好考虑一下系统传输的特性。比如,若CLIENT端超过5秒钟没有数据过来,则认为是断线。
    像硬件的客户端,一般都是联了服务器就不停发数据,若服务器几秒钟都收不到,肯定出问题了。
    正常关闭的话会受到SOCKET CLOSE的消息。
      

  10.   

    昨天找人问了一下,他说TCP通讯不能得到掉线的信号,现在很是郁闷啊…………
      

  11.   


    就像你的OnReceive()一样,CAsyncSocket、CSocket有一虚函数OnClose(),当该函数激活时就是连接断开时。当OnClose()被激活时用一个数据成员记录即可,其他操作前可以先检测该记录值。