最近工作过程中,遇到了在TCP建立好连接以后,发送和接收过程中,网络断开引起的socket无法关闭的问题。

ps:TCP的发送和接收都使用的是阻塞模式

一、设置发送和接收的超时时间

最开始想到的解决办法是设置发送和接收的超时时间,这样超时时间到了,发送和接收都会返回,socket就能正常关闭了。但是设置超时时间会引起其他问题。

1、设置发送超时以后,客户端(上位机)会出现,Interrupted system call问题,产生原因是send函数在阻塞模式下,一定要等到有可用空间将send发送的数据拷贝到发送缓冲中,但是超时了,还没发送,就出现Interrupted system call。

2、设置接收超时以后,客户端(上位机)会出现,TCP读取 [WinError 10053] 你的主机中的软件中止了一个已建立的连接问题

二、加大发送缓冲区

上面试验了,发送改为非阻塞行不通,所以还是改为阻塞了。既然是因为发送缓冲区太小了,导致send函数阻塞在等待可用缓冲区上了,那我直接加大发送缓冲区,让send函数能立即返回,这样send就不会阻塞了。

1.设置socke的发送缓冲区大小,实验了不生效


int sendbuf_len = (320 * 1024);setsockopt(newsockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf_len, sizeof(int));

最后通过直接修改系统的TCP发送缓冲区解决

/proc/sys/net/core/rmem_max        #收缓冲区最大值
/proc/sys/net/core/wmem_max        #发缓冲区最大值
/proc/sys/net/core/rmem_default    #收缓冲区默认值
/proc/sys/net/core/wmen_default    #发缓冲区默认值1.一次能send的最大数据是发送缓冲区最大值的两倍(x2)2.默认发送缓冲区最大值默认是(160 * 1024)
所以这里一次能发送的最大数据就是(320 * 1024)3.观察应用层,发现发送的最大数据大小是 (450 * 1024)
所以这里设置发送缓冲区最大值为 (320 * 1024 = )echo 327680 > /proc/sys/net/core/wmem_max

三、设置tcp的keepalive属性

接收阻塞的问题还没有解决,最后发现通过设置tcp的keepalive属性能解决网络断开以后,接收阻塞不退出问题。

int keepalive = 1; // 开启keepalive属性int keepidle = 10; // 如该连接在10秒内没有任何数据往来,则进行探测int keepinterval = 3; // 探测时发包的时间间隔为3秒int keepcount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.setsockopt(newsockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive));setsockopt(newsockfd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepidle, sizeof(keepidle));setsockopt(newsockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval, sizeof(keepinterval));setsockopt(newsockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount, sizeof(keepcount));

TCP过程中,网络断开问题解决办法相关推荐

  1. elasticsearch安装过程中的license问题解决办法

    elasticsearch安装过程中的license问题解决办法 参考文章: (1)elasticsearch安装过程中的license问题解决办法 (2)https://www.cnblogs.co ...

  2. linux中license路径,Elasticsearch安装过程中的license问题解决办法

    Elasticsearch安装过程中的license问题解决办法 1.git clone git://github.com/mobz/elasticsearch-head.git 2.cd elast ...

  3. IG NZT 安装使用过程中可能遇到的问题解决办法

    问:为什么我无法添加源地址,提示很多黄色英文或者红色英文错误? 答:首先考虑网络问题,这里网络是指连接源地址的网络通畅度,也许你是有网络可以上百度,但是不能添加源地址或者安装软件,这里我推荐使用3G/ ...

  4. iG/NZT安装使用过程中可能遇到的问题解决办法(根据用户反馈持续更新中...)

    问:为什么我无法添加源地址,提示很多黄色英文或者红色英文错误? 答:首先考虑网络问题,这里网络是指连接源地址的网络通畅度,也许你是有网络可以上百度,但是不能添加源地址或者安装软件,这里我推荐使用3G/ ...

  5. 程序分析过程中遇到疑难问题解决办法

    1.怎样分析一个程序的流程 C# JAVA C++ 打印出调用堆栈. (1).打印C#调用堆栈 new System.Diagnostics.StackTrace().ToString() (2).打 ...

  6. win10系统安装数据库SQL-server过程中出现的问题解决方法

    win10系统安装数据库SQL-server过程中出现的问题解决方法 一.出现提示需要安装Microsoft .NET Framework 3.5的三种解决办法 1,进入网址https://www.m ...

  7. Esxi 6.7.0版本导出虚拟机OVF网络错误问题解决办法【实测有用】

    Esxi 6.7.0版本导出虚拟机OVF网络错误问题解决办法 在VMware ESXi 6.7.0平台上想要导出虚拟机,需关闭虚机电源,点击"导出"提示一共要下载几个文件,一个是. ...

  8. Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

    去除 vi/vim 和 git diff 中的 ^M 问题解决办法 问题现象 初步分析 进一步查看 问题解决 Source Insight dos2unix Nodpad++ Vim sed 命令 综 ...

  9. VS2008运行过程中出现regsvr32问题解决方法记录

    VS2008运行过程中出现regsvr32问题解决方法 vs2008运行工程文件过程中提示regsvr32出现问题,此时我的项目中有3个工程,两个是依赖,第三个是我建立的运行工程,出现这个问题之后,我 ...

  10. 电脑连接WiFi后浏览器无法上网但其他软件正常使用——网络代理问题解决办法

    电脑连接WiFi后浏览器无法上网但其他软件正常使用--网络代理问题解决办法 电脑连接WiFi后,浏览器不能正常打开网页,但是QQ等软件正常使用,浏览器显示如下图: 浏览器显示为连接到互联网,点击运行W ...

最新文章

  1. python爬虫个人如何挣钱-个人利用Python爬虫技术怎么挣钱
  2. 《Effective C#》读书笔记——条目28:提供粗粒度的互联网API使用C#表达设计
  3. Docker中运行命令时提示:Cannot connect to the Docker daemony...以及设置docker开机启动
  4. es6中新增对象的特性和方法
  5. 【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。
  6. PyCharm安装Twisted库(报错:Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Stu)
  7. java 获取oracle表结构_Java导出oracle表结构实例详解
  8. 卷积神经网络CNN经典模型整理(AlexNet,GoogleNet,VGG,Deep Residual Learning)
  9. C#语法基础(一)----键盘读入整数foreach语句
  10. python抽签小程序
  11. IT知识点及书籍推荐
  12. SpringBoot + React汽车租赁管理系统 附带详细运行指导视频
  13. python有道批量单词音标整理-Python 批量翻译 使用有道api;
  14. 微表面模型Beckmann–Spizzichino distribution的概率密度函数推导
  15. 什么是生化分析中的反应曲线?
  16. 天梯赛题目练习——平面向量加法(附带PTA测试点)
  17. I2C知识大全系列一 —— I2C相关概念
  18. Kinect v2和Intel RealSense D435的三维重建对比
  19. 集成电路中的低功耗设计(一)
  20. 奇葩公司规定之搞笑版(改编自真实规定)

热门文章

  1. 谈谈MySQL的WAL、LSN、checkpoint
  2. Glide加载有验证信息的Url图片
  3. 计算机二级随身学,计算机等级考试二级C
  4. 金牌是科技的较量 奥运体育大会召开在即
  5. PHP-10-mysql
  6. 企业数据治理面临的 6 大挑战!
  7. Java web文件上传下载
  8. 小程序 使用微信内置地图查看当前位置信息
  9. 汇票的功能有支付功能
  10. Sourcetree基本操作介绍