TCP连接异常:broken pipe 和EOF
本文介绍3种TCP连接异常的情况。
1.server端没有启动,client尝试连接
./client
dial failed: dial tcp 127.0.0.1:8080: connect: connection refused
通过tcpdump抓包,可以看到当server没有启动的时候,client向server8080端口发送数据后,client端会收到RST。
2.client端读数据,突然异常退出或直接close连接
2.1 准备
server
server等待连接,如果有client连接过来,连接建立后,会向client发送数据。
server代码如下:
package main
import (
"net"
"log"
"time"
)
func main() {
addr := "0.0.0.0:8080"
tcpAddr, err := net.ResolveTCPAddr("tcp",addr)
if err != nil {
log.Fatalf("net.ResovleTCPAddr fail:%s", addr)
}
listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Fatalf("listen %s fail: %s", addr, err)
} else {
log.Println("rpc listening", addr)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Println("listener.Accept error:", err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
var buffer []byte = []byte("You are welcome. I'm server.")
for {
time.Sleep(3*time.Second)
n, err := conn.Write(buffer)
if err != nil {
log.Println("Write error:", err)
break
}
log.Println("send:", n)
}
log.Println("connetion end")
}
client
client端连接server,并接收server端数据。
client代码如下:
package main
import (
"log"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Println("dial failed:", err)
os.Exit(1)
}
defer conn.Close()
buffer := make([]byte, 512)
for {
n, err := conn.Read(buffer)
if err != nil {
log.Println("Read failed:", err)
return
}
log.Println("count:", n, "msg:", string(buffer))
}
}
2.2 操作步骤如下
(1).client与server建立连接后
(2).启动server
(3).启动client
(4).client异常退出
client 进程异常退出或者close连接,都会发送FIN。
./client
2019/04/13 19:45:44 count: 28 msg: You are welcome. I'm server.
^C
19:45:44后, Ctrl + C 退出
(5).查看server端报错
./server
2019/04/13 19:45:17 rpc listening 0.0.0.0:8080
2019/04/13 19:45:44 send: 28
2019/04/13 19:45:47 send: 28
2019/04/13 19:45:50 Write error: write tcp 127.0.0.1:8080->127.0.0.1:62785: write: broken pipe
2019/04/13 19:45:50 connetion end
client退出后,server发送了两次数据,第一次没有报错,第二次报错:
2019/04/11 15:49:04 send: 28
2019/04/11 15:49:07 Write error: write tcp 127.0.0.1:8080->127.0.0.1:54631: write: broken pipe
通过tcpdump抓包可以发现,client退出后,server第一次发送给client,client返回给server RST。
第二次在这个RST的连接上,server继续发送,出现broken pipe。
3.server端写数据,突然异常退出或直接close连接
3.1 准备
server、client代码同上。
3.2 操作步骤
(1).client与server建立连接后
(2).启动server
(3).启动client
(4).server异常退出
server 进程异常退出或者close连接,都会发送FIN。
./server
2019/04/11 15:58:46 rpc listening 0.0.0.0:8080
2019/04/11 15:58:54 send: 28
2019/04/11 15:58:57 send: 28
^C
(5).查看client报错
./client
2019/04/11 15:58:54 count: 28 msg: You are welcome. I'm server.
2019/04/11 15:58:57 count: 28 msg: You are welcome. I'm server.
2019/04/11 15:58:58 Read failed: EOF
4.总结
如果server端没有启动,client尝试连接时,会收到RST。
连接建立后,如果读端或者写端关闭连接,具体分两种情况:
- 如果读端关闭连接,写端继续写,第一次写,会收到RST,再写,报错
broken pipe - 如果写端关闭连接,读端继续读,报错
EOF
- 如果读端关闭连接,写端继续写,第一次写,会收到RST,再写,报错
TCP连接异常:broken pipe 和EOF的更多相关文章
- TCP连接异常断开检测(转)
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- (转)TCP连接异常断开检测
TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...
- 针对TCP连接异常断开的分析
我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...
- 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。
环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS-6.8-x86_64,Apache,MySQL5.1,PHP5.3. 问题:现公司有一个php系统,需要重复向后台发送ajax ...
- jedis异常Broken pipe (Write failed)
异常:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exc ...
- 我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景
欢迎关注公众号:bin的技术小屋,本文图片加载不出来的话可查看公众号原文 本系列Netty源码解析文章基于 4.1.56.Final版本 写在前面..... 本文是笔者肉眼盯 Bug 系列的第三弹,前 ...
- java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe
今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题. 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但 ...
- tcp连接时,BROKEN PIPE错误的原因以及解决方法
问题: 写了一个server和一个client,UNIX套接字的,server不断接收消息并打印出来,client是一个交互程序,输入一个消息回车发送,接着又可以输入消息.出问题了:当server监听 ...
- 从tcp原理角度理解Broken pipe和Connection reset by peer的区别
从tcp原理角度理解Broken pipe和Connection reset by peer的区别 http://lovestblog.cn/blog/2014/05/20/tcp-broken-pi ...
随机推荐
- Java冒泡法和二分法
最近去一家公司面试,手贱在人家CTO面前自告奋勇写了一把冒泡法,结果在交换数据的时候出了洋相,回家反思,写下如下代码,对自己算是一个鞭策,得到的教训是不要眼高手低,低调前行. package com. ...
- java 接口1
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...
- 读取HeidiSQL 配置文件中的密码
读取HeidiSQL 配置文件中的密码 2017-1-21 5:42:01 codegay HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库, 很多管理工具都会把密码 ...
- 关于position的一些问题
position属性: static:静止 relative:相对的 fixed:固定的 absolu:绝对的 position的一些实例子如下: HTML: <!DOCTYPE htm ...
- Python第三章(北理国家精品课 嵩天等)
一.数字类型及其操作 整数:pow(x,y),想算多大,就算多大:以0b或0B开头表示二进制:以0o或0O开头表示八进制:以0x或0X开头表示十六进制. 浮点数:取值范围-10^308至10^308, ...
- wpf binging(五) 数据的转换与验证
1.数据的验证,有时候需要验证同步的数据是否正常 需要派生一个类 ValidationRule 再把这个类指定给binging 进行验证 在这里如果验证不通过 textbox就会变成红色并且发出警告数 ...
- Strongly connected components
拓扑排列可以指明除了循环以外的所有指向,当反过来还有路可以走的话,说明有刚刚没算的循环路线,所以反过来能形成的所有树都是循环
- Tensorflow系列——Saver的用法
摘抄自:https://blog.csdn.net/u011500062/article/details/51728830/ 1.实例 import tensorflow as tf import n ...
- C#连接字符串
1."Data Source=服务器名; Initial Catalog=数据库; User ID =用户名; Password=密码; Charset=UTF8; " 2.&qu ...
- 合肥工业大学oj G-诺德森海岸
#include<iostream> #include<vector> #include<bits/stdc++.h> using namespace std; v ...