zoukankan      html  css  js  c++  java
  • Tcp服务端判断客户端是否断开连接

         今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的。好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链接的时候才能成功链接。

          然后就开始找各种方法。其中简单的是看recv()返回为0,表明断开了链接,但是recv函数始终返回SOCKET_ERROR,找不到原因。。。。。。。。。。。。

          现在已经调通了,就是recv()==0时,断开连接。先主要是没有用accept()的socket,当然接收不到东西。。。

    参考的方法: 下面来罗列一下判断远端已经断开的方法:

    法一: 当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。

    法二:

    struct tcp_info info;

    int len=sizeof(info);

    getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开

    法三: 若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。

    法四:

    int keepAlive = 1; // 开启keepalive属性

    int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测

    int keepInterval = 5; // 探测时发包的时间间隔为5 秒

    int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

    setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));

    setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));

    setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));

    setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

    设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误

    法五: 自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。 参考:http://www.cppblog.com/luketowne/articles/77780.html http://www.blogjava.net/thisliy/archive/2010/02/17/313271.html http://blog.csdn.net/henry000/article/details/7250866

  • 相关阅读:
    CSS练习
    大作业“抽屉页面”html+css
    html练习代码
    协程-基于TCP的高并发通信
    协程-爬虫示例
    互斥锁,递归锁,信号量
    三层架构(我的理解及详细分析)
    递归算法经典实例小结(C#实现)
    使用XmlWriter写Xml
    使用XmlReader读Xml
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5723936.html
Copyright © 2011-2022 走看看