golang TCPConn.SetWriteDeadline doesn't seem to work as expected
从现在开始,我们要努力学习啦!今天我给大家带来《golang TCPConn.SetWriteDeadline doesn't seem to work as expected》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到golang等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!
问题内容
I'm trying to detect sending failures by inspecting the error returned by golang TCPConn.Write, but it's nil. I also tried using TCPConn.SetWriteDeadline without success.
That's how things happen:
- the server starts
- a client connects
- the server sends a message and the client receives it
- the client shuts down
- the server sends one more message: no error
- the server sends the third message: only now the error appears
Question : why only the second message to a non-existing client results in an error? How should the case be handled properly?
The code follows:
package main
import (
"net"
"os"
"bufio"
"fmt"
"time"
)
func AcceptConnections(listener net.Listener, console
The server console looks like this:
listening on 127.0.0.1:6666
client connected
hi there!
read from console: hi there!
msg sent: hi there!
this one should fail
read from console: this one should fail
msg sent: this one should fail
this one actually fails
read from console: this one actually fails
failed sending a message to network: write tcp 127.0.0.1:51194: broken pipe
The client looks like this:
package main
import (
"net"
"os"
"io"
//"bufio"
//"fmt"
)
func cp(dst io.Writer, src io.Reader, errc chan
EDIT : Following JimB's suggestion I came up with a working example.
Messages don't get lost any more and are re-sent in a new connection. I'm not
quite sure though how safe is it to use a shared variable (connWrap.IsFaulted)
between different go routines.
package main
import (
"net"
"os"
"bufio"
"fmt"
)
type Connection struct {
IsFaulted bool
Conn net.Conn
}
func StartWritingToNetwork(connWrap * Connection, errChannel chan
正确答案
This isn't Go specific, and is a artifact of the underlying TCP socket showing
through.
A decent diagram of the TCP termination steps is at the bottom of this page:
http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
The simple version is that when the client closes its socket, it sends a FIN,
and receives an ACK from the server. It then waits for the server to do the
same. Instead of sending a FIN though, you're sending more data, which is
discarded, and the client socket now assumes that any more data coming from
you is invalid, so the next time you send you get an RST, which is what
bubbles up into the error you see.
Going back to your program, you need to handle this somehow. Generally you can
think of whomever is in charge of initiating a send, is also in charge of
initiating termination, hence your server should assume that it can continue
to send until it closes the connection, or encounters an error. If you need
to more reliably detect the client closing, you need to have some sort of
client response in the protocol. That way recv can be called on the socket and
return 0, which alerts you to the closed connection.
In go, this will return an EOF error from the connection's Read method (or
from within the Copy in your case). SetWriteDeadline doesn't work because a
small write will go though and get dropped silently, or the client will
eventually respond with an RST, giving you an error.
以上就是《golang TCPConn.SetWriteDeadline doesn't seem to work as expected》的详细内容,更多关于golang的资料请关注golang学习网公众号!
具有多个证书的 http.ListenAndServeTLS
- 上一篇
- 具有多个证书的 http.ListenAndServeTLS
- 下一篇
- VSCode无法安装Go工具怎么解决
-
- Golang · Go问答 | 2小时前 |
- Go rtreego 最近邻查询中的距离基于什么对象
- 250浏览 收藏
-
- Golang · Go问答 | 2小时前 |
- Go sonyflake Sonyflake与UUID的存储形态有什么区别
- 277浏览 收藏
-
- Golang · Go问答 | 2小时前 | go · Go 采样率 播放速度 Resample beep ResampleRatio
- Go beep 采样率转换与修改播放速度有什么区别
- 482浏览 收藏
-
- Golang · Go问答 | 3小时前 |
- Go llrb 插入后修改排序字段为什么会破坏检索
- 288浏览 收藏
-
- Golang · Go问答 | 3小时前 | 数据结构 · Go问答 · Go Less LLRB ReplaceOrInsert 排序等价
- Go llrb ReplaceOrInsert怎样判断两个对象相同
- 412浏览 收藏
-
- Golang · Go问答 | 3小时前 |
- Go rtreego 空间对象维数不一致会怎样
- 424浏览 收藏
-
- Golang · Go问答 | 3小时前 |
- Go bloom 合并Bloom过滤器为什么要求参数一致
- 252浏览 收藏
-
- Golang · Go问答 | 4小时前 | go · 性能 · BLOOM Go 容量 误判率 Bloom Filter
- Go bloom 过滤器容量不足怎样影响误判率
- 109浏览 收藏
-
- Golang · Go问答 | 4小时前 |
- Go bloom Bloom命中为什么不能证明元素存在
- 386浏览 收藏
-
- Golang · Go问答 | 4小时前 |
- Go bitset Complement为何需要明确有效长度
- 169浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 809次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 798次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 890次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 862次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 687次使用
-
- GOLANG使用Context管理关联goroutine的方法
- 2022-12-28 193浏览
-
- 聊聊Go中的注释和godoc工具
- 2022-12-29 354浏览
-
- 聊聊Golang语言中的复数类型
- 2023-01-07 418浏览
-
- 浅析Golang中的浮点类型(float32和float64)
- 2022-12-23 161浏览
-
- 聊聊Golang中的整数类型
- 2022-12-24 209浏览

