WinSocket编程(TCP/IP):
一个服务器端和多个客户连接,客户端和服务器连接成功后,服务器端就一直向连接成功的客户端发送数据包;请问的是:
1.如果某个客户端正常退出,服务器端怎么知道该客户端退出了?
2.如果非正常退出(例如客户端拔了网线),服务器端如何知道该客户已经断开连接的?
有人说用定时发送数据包检查,请问具体如何实现了?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3418/3418007.xml?temp=.7021906
    http://community.csdn.net/Expert/topic/3318/3318873.xml?temp=.3287317
      

  2.   

    根据发送函数send()的返回结果可以知道连接是否已中断
      

  3.   

    发送ping包,如果有回复就是连通的,否则就认为是不通.tcp/ip一般都使用这样的机制.
      

  4.   

    2个问题都是调用send recv来判断啊1,某个客户端在正常退出之前发个退出消息给服务端,服务端就知道了
    2,定时发送的数据包叫做心跳包,服务端发送,客户端返回,发送的内容就是普通的字符串,客户端服务端都可以理解的字符串,一段时间客户端不返回了,服务端将客户端视为断线,时间多长由你自己决定
      

  5.   

    我觉得heartbeat是比较好的方法。
      

  6.   

    正常退出会有FIN 四次握手通知
    异常退出,需要发送heartbeat包来维持,保活定时器
      

  7.   

    1。正常退出,server 的recv()==0
    由次判断
    2。非正常,heartbeat
    就是服务器定时发个包到CLIENT 看是否ACK
    无ACK,CLIENT DOWN
      

  8.   

    1。正常退出,server 的recv()==0
    由次判断
    ==============================
    正常退出,服务器端可以收到什么消息啊?
    如果客户端没有发送消息,服务器端recv本来就不能收到什么数据啊?
    客户端正常退出,服务器端会自动触发什么事件吧?????????????????/
      

  9.   

    如果客户端没有发送消息,服务器端recv本来就不能收到什么数据啊?
    在tcp/ip中当断开连接时,即close ,会发一个fin包
    而在socket设计师,当正常退出,也即closesocket时
    server recv()==0
      

  10.   

    还是不明白,当客户端自动退出,应该是自动触发服务器端的OnClose()事件吧?
    怎么用recv来判断??????????????????
      

  11.   

    服务端:(如果连接断线会马上就返回的)
    函数send()
    WSAGetLastError()客户端:
    Read()
    WSAGetLastError()
    如果判断到掉线,就重新连接。另外,如果客户端端主动退出,应该send一个信息给服务器知道。但是如果你客户端是连接上后只有read()的动作而没有send() 的动作,你们服务器将无法得志是客户端是否是自愿退出。
      

  12.   

    服务端:(如果连接断线会马上就返回的)
    函数send()
    WSAGetLastError()
    ==========================================
    ??????????????????????????//
    客户端自动退出,服务器端要send????才知道客户端退出?
    你说的马上返回是在哪里返回???????????????????????????????
      

  13.   

    还是不明白,当客户端自动退出,应该是自动触发服务器端的OnClose()事件吧?
    怎么用recv来判断??????????????????
    你是用csocket的吧
    我是用socket api来说明,不过原理的东西是一样的,