TCP过程中,网络断开问题解决办法
最近工作过程中,遇到了在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过程中,网络断开问题解决办法相关推荐
- elasticsearch安装过程中的license问题解决办法
elasticsearch安装过程中的license问题解决办法 参考文章: (1)elasticsearch安装过程中的license问题解决办法 (2)https://www.cnblogs.co ...
- linux中license路径,Elasticsearch安装过程中的license问题解决办法
Elasticsearch安装过程中的license问题解决办法 1.git clone git://github.com/mobz/elasticsearch-head.git 2.cd elast ...
- IG NZT 安装使用过程中可能遇到的问题解决办法
问:为什么我无法添加源地址,提示很多黄色英文或者红色英文错误? 答:首先考虑网络问题,这里网络是指连接源地址的网络通畅度,也许你是有网络可以上百度,但是不能添加源地址或者安装软件,这里我推荐使用3G/ ...
- iG/NZT安装使用过程中可能遇到的问题解决办法(根据用户反馈持续更新中...)
问:为什么我无法添加源地址,提示很多黄色英文或者红色英文错误? 答:首先考虑网络问题,这里网络是指连接源地址的网络通畅度,也许你是有网络可以上百度,但是不能添加源地址或者安装软件,这里我推荐使用3G/ ...
- 程序分析过程中遇到疑难问题解决办法
1.怎样分析一个程序的流程 C# JAVA C++ 打印出调用堆栈. (1).打印C#调用堆栈 new System.Diagnostics.StackTrace().ToString() (2).打 ...
- win10系统安装数据库SQL-server过程中出现的问题解决方法
win10系统安装数据库SQL-server过程中出现的问题解决方法 一.出现提示需要安装Microsoft .NET Framework 3.5的三种解决办法 1,进入网址https://www.m ...
- Esxi 6.7.0版本导出虚拟机OVF网络错误问题解决办法【实测有用】
Esxi 6.7.0版本导出虚拟机OVF网络错误问题解决办法 在VMware ESXi 6.7.0平台上想要导出虚拟机,需关闭虚机电源,点击"导出"提示一共要下载几个文件,一个是. ...
- Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法
去除 vi/vim 和 git diff 中的 ^M 问题解决办法 问题现象 初步分析 进一步查看 问题解决 Source Insight dos2unix Nodpad++ Vim sed 命令 综 ...
- VS2008运行过程中出现regsvr32问题解决方法记录
VS2008运行过程中出现regsvr32问题解决方法 vs2008运行工程文件过程中提示regsvr32出现问题,此时我的项目中有3个工程,两个是依赖,第三个是我建立的运行工程,出现这个问题之后,我 ...
- 电脑连接WiFi后浏览器无法上网但其他软件正常使用——网络代理问题解决办法
电脑连接WiFi后浏览器无法上网但其他软件正常使用--网络代理问题解决办法 电脑连接WiFi后,浏览器不能正常打开网页,但是QQ等软件正常使用,浏览器显示如下图: 浏览器显示为连接到互联网,点击运行W ...
最新文章
- python爬虫个人如何挣钱-个人利用Python爬虫技术怎么挣钱
- 《Effective C#》读书笔记——条目28:提供粗粒度的互联网API使用C#表达设计
- Docker中运行命令时提示:Cannot connect to the Docker daemony...以及设置docker开机启动
- es6中新增对象的特性和方法
- 【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。
- PyCharm安装Twisted库(报错:Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Stu)
- java 获取oracle表结构_Java导出oracle表结构实例详解
- 卷积神经网络CNN经典模型整理(AlexNet,GoogleNet,VGG,Deep Residual Learning)
- C#语法基础(一)----键盘读入整数foreach语句
- python抽签小程序
- IT知识点及书籍推荐
- SpringBoot + React汽车租赁管理系统 附带详细运行指导视频
- python有道批量单词音标整理-Python 批量翻译 使用有道api;
- 微表面模型Beckmann–Spizzichino distribution的概率密度函数推导
- 什么是生化分析中的反应曲线?
- 天梯赛题目练习——平面向量加法(附带PTA测试点)
- I2C知识大全系列一 —— I2C相关概念
- Kinect v2和Intel RealSense D435的三维重建对比
- 集成电路中的低功耗设计(一)
- 奇葩公司规定之搞笑版(改编自真实规定)