本人在作socket服务器,请问一下,这个发送心跳包的工作是在服务器端作,还是在客户端作呀,另:接收的那端应该如何接收发心跳包是不是这两个方法都得用啊Socket.SetSocketOption()
Socket.IOControl()
请高手来解达我的困惑,谢谢

解决方案 »

  1.   

    服务器端监听,客户端发送请求
    原理上就是客户端每隔一段时间T给服务器发送请求,以确定存活
    如3T时间服务器未收到客户端请求,则客户端自动登出;若3T时间客户端未收到服务器响应,则服务器异常,或自动重连服务器监听即可
    Socket.SetSocketOption()
    Socket.IOControl()
    这两个方法比较生,好像是在raw socket的时候用过
    一般用不着
      

  2.   

    谁发谁收看你是服务器需要知道客户端的状态还是客户端需要知道服务器的状态,需要被了解状态的负责发.
    接收那端接收时定一个timeout,可以用锁然后waitone(timeout),也可以直接异步,超时没收到就表示对方已经离线.
    至于最后那两个函数不清楚,等高手,共同学习
      

  3.   

    谢谢你们的回答,因为我现在服务器端用的是异步socket,然后 c# 里 上面我说的那两个方法可以设置socket的低级操作,心跳包的原理我懂,只是不知道该怎么去接收这个包,而且这个包会不会影响正常的数据包呀,谁能给我段代码,告诉我这个包该怎么去接,谢谢了
      

  4.   

    ...
    9楼说的是不用独立线程和socket,用协议的标示来区别心跳包“哦,也就是说双方设定好了之后只要捕获异常就OK了呗,不用处理别的了,我可以这样理解吗? ”可你说的我总觉得不是那么个味道话说9楼的方法你肯定更晕。朋友,动手写几行代码,能通信了再来问吧,不然要说的太多
      

  5.   

    我的代码都写完了,只是这段时间这个功能急需解决,才上来发这个帖,现在就是为了解决网线被拔掉这样的无法捕捉到的事件,我在msdn上看到的socket.iocontrol这个方法,只是想和大家分享一下解决问题的方法,光说原理性的东西大家都会,提出解决问题的实际办法才靠谱
      

  6.   

    忘掉socket.iocontrol吧。它跟你的业务流程设计没有任何关系,它的所谓心跳跟你的业务通信协议上的心跳也没有关系,在你使用更为高级的平台(例如silverlight)或者更为高级的包装(例如tcpclient)等时候也没有这个东西。业务上的心跳,是需要定义业务系统的动作的,例如用来刷新客户端是否活跃这个状态信息。跟你纠结的不是一个东西。
      

  7.   

    哦,没有任何关系,那请问一下这个东西到底能作些什么,我在网上看到确实有人在用这个东西作keep alive,而且说这个东西设置完后都由系统自动完成的======================================================
    我倒是有点担心你“写完了”的代码其实跟实际经验所说的常用功能需求差十万八千里,只是纠结一点编程概念。
    ======================================================
    我们的功能要求十分简单,只要能检测到某台机器是否在线就ok了,呵呵,但是就是这种异常发生的行为我捕获不到,我确实是开发经验不足,还请多多指教