;Tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为: a. 连接的对端正常关闭. b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法通知对端的,所以连接会一直存在,浪费国家的资源. tcp协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属性的默认值很大. 全局设置可更改/etc/sysctl.conf,加上: net.ipv4.tcp_keepalive_intvl = 20net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_time = 60在程序中设置如下: #include #include #include #include #include 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));在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT 。
推荐阅读
- Linux系统下history命令的记录如何删除
- PanDownload中下载分享链接具体操作步骤
- 下完大雨鱼好钓吗
- 新手学堂:Linux下C语言编程的注意事项
- Linux系统下查看文件调用情况Shell命令
- 实用技巧:在Linux系统中查找文件的方法
- Linux系统如何让普通用户具有mount权限
- Linux操作系统的文件属性与目录配置解析
- 实例解析:Linux系统启动过程的故障排除
- 新手学堂:Linux操作系统的软件安装方法