本帖最后由 VisualEleven 于 2010-12-07 09:00:59 编辑

解决方案 »

  1.   

    本帖最后由 VisualEleven 于 2010-12-07 09:01:07 编辑
      

  2.   

    网上有些帖子说到有两种方法:
    心跳包
    KeepAlive
    而KeepAlive处理这种问题是比较有针对性的,只是不知道KeepAlive具体是如何使用的.
      

  3.   


    设置完keepalive以后,对端掉电以后recv就可以尽快的返回报错了,其他和正常socket使用没有差别啊。
      

  4.   

    RAW SOCKET 估计会是个麻烦.
    由于网络层的东西都可以自己构造,不太清楚它是否也和普通SOCKET拥有一样的特性.
    普通的SOCKET,使用TCP协议的话,协议本身就会维护和检查连接的有效性.
    你只需要检查下这个SOCKET是否可用.(如可否收发数据).
    看了一堆的答非所问, 我发现,程序员真的是很容易按自己的思维去想当然....
      

  5.   

    《UNIX网络编程》对keeplive有详细说明
      

  6.   

    兄弟,你这TCP的水平还得再回去学学
      

  7.   

    是么?
    那也建议你先搞清楚什么是原始SOCKET了再和我谈.我的TCP水平,已经在项目和软件里使用,倒是你呢? 看书看明白了?
    书上说要用keepalive,你就也这么认为一定要用了? 自己写代码测试过了没呢?
      

  8.   

    知道TCP为什么是可靠连接么? 先搞清楚了再点评别人.
      

  9.   


    请问如何检查SOCKET是否可用?
      

  10.   

    这"原始SOCKET"一词是我说的,可能说成"普通的SOCKET"比较合适.然后说到TCP的稳定性能保证连接的有效,这点当然也没错,但是在另一方如断电的情况下,这头如果不用心跳包或者keepalive的话还真的不知道要怎么检测出来.正如18楼的兄台据说,如何检查SOCKET是否可用?
      

  11.   

    呼,难道都没看到我后面的括号里的内容么? 那不就是.当然,如果你对实时性(就是一断电就要知道)要求很高,你还是可以用KEEPALIVE方案.
    这个方案无非是通知操作系统,对某个SOCKET要严加检查.及时发现其不可用状态.如果要求不高,按照TCP的标准,在间隔一定时间后,你也是会知道某个SOCKET的正确的状态.
    而不需要你修改任何代码.还有,RAW SOCKET才叫原始SOCKET.也就是原始套接字,Windows下可以用来构造IP头和数据层内容.
    所以我怀疑操作系统对这类型的SOCKET有所区别.你可真是把我误导了...
      

  12.   

    TCP只所以是可靠的,就因为他不需要你维护.
    而是操作系统的协议堆栈和协议设计的特性维护的.所以,如果一方断电, TCP协议肯定可以检查到连接不可用. 不然,它如何是可靠连接?
    只不过按照TCP协议的默认特性,它并不认为是断电事件,而是认为网络出现问题...所以如果你想要有断电事件有针对性,要么就利用KEEPALIVE机制,要么自己开发一套通讯机制.提问的每个字眼,直接关系到你的答案.务必认真.不要想当然. 
    我认真看了你的字眼,你却没认真提问.
      

  13.   

    非常感谢你的认真的回复,我当时也想不出该用什么样的词汇来表述,对于我用词的不准确表示抱歉,以后定会注意的.你可能没有经历过一边断电的情况,如果完全依靠TCP本身,当A端断电后,B端在很长时间内是没有任何反应的(具体多长还没试过),此时发送数据也不会有A端的回复(但是有时正常情况下也不会返回数据).所以我才觉得有必要使用一种机制,如只要B发送数据A都必须有所返回,如果多次都没有返回就说明A端出现故障了.
    你的文字比较抽象,像(可否收发数据),我们要是把这句话完善扩展以后可能就变成了心跳包机制了.
    在学术上我觉得应怀着谦虚的心态.
      

  14.   

    很负责地告诉你,断电行为,正是我软件必须检测到的事件.
    或则可以说,任何一个和网络有关的项目,都要考虑到这个事情.
    在编码过程中,我甚至断了不下50次,来检测各种机制的有效性.
    最后采用了默认的TCP检测机制.因为这是是最适合我项目要求的.
    至于谦虚的心态,我想对于认真负责有技术功底的人,我肯定心怀谦虚.在CSDN也看回帖无数了,相当大一部分的程序员,都是用一种惯性思维去考虑和回答别人的问题.
    有时候,甚至是答非所问. 所以,我不必对这部分不负责任的人谦虚. 都说程序员是思维严谨的人群,
    思维严谨不是让你凡事惯性思维,不知所以然.自以为就是那样.
      

  15.   

    大部分程序员采用应用层发特定包,实现心跳,少数程序员采用驱动已经实现的心跳,即SO_KEEPALIVE
      

  16.   


    那个,还是描述一下到底如何确定可否收发数据!只要使用伪代码描述一下过程就行了!“如果要求不高,按照TCP的标准,在间隔一定时间后,你也是会知道某个SOCKET的正确的状态”
    这个间隔时间一般是多少?
    我还真不知道这个间隔时间是多少,只知道时间有点长!
      

  17.   

    tcp/ip 协议的心跳机制Keepalive,默认好像是2小时的,这个是可以改的!
      

  18.   

    keepAlive在服务端不断写数据的时候无效。
      

  19.   

    keepalive是默认2个小时,而且判断不到断电和网络断开的情况。
      

  20.   

    也就是说那边不是正常断开的话,用keepalive是判断不到,就成了一边的半连接状态。所以大家都推荐心跳,这样,有发有收是一个完整的连接。