TCP连接被远程主机强制关闭错误判断实例

如果你遇到错误消息 “An existing connection was forcibly closed by the remote host.”,这通常意味着远程服务器(即“remote host”)非正常地关闭了TCP连接。这可能是因为多种原因,比如服务器遇到了问题、服务器决定断开连接以释放资源,或者因为服务器实施了某些安全策略等。

一:错误识别

在Go的net包中,这种错误通常会被封装成一个net.OpError,你可以通过类型断言来检查错误是否为*net.OpError,并进一步检查其Err字段来识别具体的错误原因。如果Err字段包含syscall.ECONNRESET错误(在Windows上可能是syscall.WSAECONNRESET),那就表示连接被远程主机强制关闭。

二:实例代码

package main  
  
import (  
	"fmt"  
	"net"  
	"os"  
	"runtime"  
	"strings"  
	"syscall"  
)  
  
func isConnReset(err error) bool {  
	if opErr, ok := err.(*net.OpError); ok {  
		if opErr.Err == syscall.ECONNRESET {  
			return true // Unix-like 系统上的 ECONNRESET  
		} else if runtime.GOOS == "windows" {  
			// Windows 上的 WSAECONNRESET 通常是通过错误消息识别的  
			if se, ok := opErr.Err.(*os.SyscallError); ok {  
				if errno, ok := se.Err.(syscall.Errno); ok {  
					if errno == 10054 { // 10054 对应 WSAECONNRESET  
						return true  
					}  
				}  
			} else if strings.Contains(opErr.Err.Error(), "WSAECONNRESET") {  
				// 如果错误消息包含 WSAECONNRESET,也认为是连接被重置  
				return true  
			}  
		}  
	}  
	return false  
}  
  
func main() {  
	// 假设 conn 是一个已经建立的 TCP 连接  
	_, err := conn.Read(buffer)  
	if err != nil {  
		if isConnReset(err) {  
			fmt.Println("连接被远程主机强制关闭")  
		} else if os.IsTimeout(err) {  
			fmt.Println("读取操作超时")  
		} else {  
			// 处理其他类型的错误  
			fmt.Printf("读取错误: %s\n", err)  
		}  
	}  
}

我们首先检查错误是否为net.OpError类型,然后针对Unix-like系统检查opErr.Err是否为syscall.ECONNRESET。对于Windows系统,我们检查opErr.Err是否实现了os.SyscallError接口,并尝试将其错误码转换为syscall.Errno类型来检查是否为10054(对应WSAECONNRESET)。如果opErr.Err不是*os.SyscallError类型,我们还检查错误消息是否包含"WSAECONNRESET"字符串。

请注意,错误消息的检查可能不是最健壮的方法,因为它依赖于错误消息的特定格式,这可能在不同的Go版本或操作系统版本中有所不同。但是,在Windows上,这通常是一种可行的方法来识别特定的网络错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux /proc进程文件目录介绍

参考:https://zhuanlan.zhihu.com/p/619966043 有时候想只查出来进程号,可以通过/proc/下查出该进程的运行及执行脚本情况信息 /proc/pid子目录 记录了进程的相关信息cmdline文件:包含了进程启动时使用的完整命令行参数。 cwd符号链接&#x…

29. 【Android教程】折叠列表 ExpandableListView

本节学习一个可折叠的 ListView,可以用在一些需要分类的场景下。通过 ExpandableListView 我们可以首先在 ListView 上展示大的分类,当点击某个类别的时候再将 ListView 做一个展开,展示该类下的所有子类供用户选择。它与 ListView 的不同主要…

考研数学|武忠祥VS张宇,谁讲得更全面❓

张宇和武忠祥都是很好的老师,你肯定也是这么觉得的,你自己也说了,跟着张宇看了几章,感觉不错,那就继续跟着啊,为什么听到同学说武忠祥好,你就动摇了呢。我们对于任何事情都要有自己的思考和规划…

SQL注入简单总结

一、SQL注入是什么 SQL注入即:是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究,发现了一个有趣的“Lost in the middle”现象&#x…

我与C++的爱恋:隐式类型转换

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 朋友们大家好,本篇内容我们来介绍初始化列表,隐式类型转换以及explicit的内容 一、初始化列表 1.1 构造函数体赋值 在创建对象时,编译器…

【笔试强训】Day3 --- 简写单词 + dd爱框框 + 除2!

文章目录 1. 简写单词2. dd爱框框3. 除2! 1. 简写单词 【链接】:简写单词 解题思路:简单模拟题,主要是处理⼀下输⼊的问题。(也可以利用string类中的find函数,但时间复杂度会偏高) #include …

一套全院级PACS系统源码,实现影像检查的电子预约申请、电子诊断报告、 临床科室设立影像浏览终端等功能

一套全院级PACS系统源码,实现影像检查的电子预约申请、电子诊断报告、 临床科室设立影像浏览终端等功能 一套全院级PACS系统源码,包括放射、CT、超声、内镜、病理等科室影像及信息管理系统的建设,解决医学影像的采集、诊断、传输、存储&#…

电感与磁珠

电感是什么? 电感会通过产生感应电动势的方式来阻碍电流的变化,电流变化率越大,产生的感应电动势越大阻碍电流效果越明显。 [一]品质因数Q: 电感的品质因数Q值定义:电感的Q值也叫作品质因数,其为无功功率除以有功功率…

永恒之蓝复现

目录 一、原理 二、实验环境 三、实验步骤 \1. 查询ip \2. 测试两台主机的连通性 \3. 查询指kali数据库的状态 \4. 此时就可以进行永恒之蓝漏洞扫描,(永恒之蓝利用的是ms17_010漏洞,因此到这一步之后的任务就是在kali 里寻找ms17_010漏…

比特币减半倒计时:NFT 生态将受到怎样的影响?

BTC 减半倒计时仅剩不到 1 天,预计在 4 月 20 日迎来减半。当前区块奖励为 6.25 BTC,减半后区块奖励为 3.125 BTC,剩余区块为 253。比特币减半无疑是比特币发展史上最重要的事件之一,每当这一事件临近,整个加密社区都充…

从零开始搭建网站(第二天)

今天把之前的htmlcssjs项目迁移过来,直接使用tspiniavue3vite组合,搭建过程可以看从零开始搭建性能完备的网站-思路过程(1)_自己架设一个芯参数网站-CSDN博客。之后安装一下volar扩展。迁移过来使用Vue重构时发现之前使用的左右两…

《深入浅出多模态》: 多模态经典模型:BLIP

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

计算机网络——GBN协议实现

实验目的 编程模拟实现GBN可靠传输软件 实验内容 C 程序模拟实现Go-Back-N可靠数据传输,需要编写一个发送端程序和一个测试端程序来模拟传输过程 具体流程 1. 编写发送端程序,调用库实现socket连接,然后主要实现滑动窗口,接收…

IDEA开启自动导包,自动删包

找到file----------->Settings选项 找到Editor-------->General------------>Auto Import选项 勾选两个选项,在点击Apply,在点击ok 最后就ok了

详解数据结构:栈

一、顺序栈 顺序栈的存储方式如下: 从图中可以看出,顺序栈需要两个指针,base指向栈底,top指向栈顶。 typedef struct SqStack {ElemType *base; //栈底指针ElemType *top; //栈顶指针}SqStack; 说明: ElemType是元…

8款不同的404页面(网站404页面必备)

第1款 部分代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>404</title><link rel"stylesheet" href"css/style.css"></head> <body><div cla…

C语言转型之路:从C到C++的类与对象初探

欢迎来CILMY23的博客 本篇主题为 C语言转型之路&#xff1a;从C到C的类与对象初探 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏系列&#xff1a; Python | C语言 | 数据结构与算法 | C 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 写在前头…

hive搭建完整教学

目录 简介准备工作安装步骤&#xff08;一&#xff09;、下载hive包并解压到指定目录下&#xff08;二&#xff09;、设置环境变量&#xff08;三&#xff09;、下载MySQL驱动包到hive的lib目录下&#xff08;四&#xff09;、将hadoop的guava包拷贝到hive&#xff08;五&#…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面&#xff1a;面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象&#xff1f; 面向对象 是具有对象概念的编程范式&#xff0c;面向对象将程序实现分为了一个个独立的对象&…
最新文章