go 处理 tcp 长连接丢失数据原因是什么

2020-12-09 10:17:18 +08:00
 Peakday

直接上代码

listen, err := net.Listen("tcp", cfg.Network.IpP)
if err != nil {
	panic("can't listen port!")
}

for {
	conn, err := listen.Accept()
	if err != nil {
		fmt.Println(err)
		continue
	}

	go func(cn net.Conn) {
		buffer := make([]byte, 1448)
		for {
			n, err := cn.Read(buffer)
			if err != nil {
				fmt.Println("tcp read error\t", err)
				continue
			}
			//丢数据问题待解决
			dataChanel <- buffer[:n]
		}
	}(conn)

使用 tcpdump 抓取报文有 200 条,但是程序只收到 190 条左右,丢数据的原因是什么,目前我怀疑是接收性能不足,在向通道传数据的过程中第二条数据就过来了,导致第二条数据直接被丢弃

3125 次点击
所在节点    Go 编程语言
24 条回复
Peakday
2020-12-09 11:50:29 +08:00
感谢大家的回复!我再去学习学习
djoiwhud
2020-12-09 11:58:44 +08:00
你对 tcpdump 使用的也有问题。tcpdump 这类工具不是给你数报文条数的。

你应该逐 bit 分析通信协议代码是否有 bug,tcpdump 保存数据到 wireshark 分析,或者直接用 wireshark 。发收方的 tcpdump 的数据串是一致的,通常有一方代码有 bug,应用层处理出错了。
namaketa
2020-12-09 13:27:05 +08:00
也在学习 go 语言。
目前来看 lz 主要的问题是直接把数据缓存完之后直接传了个 slice 。
而 slice 本质就是一个指针,后续还进行了并发操作,导致指针引用的对象变化了。
可以了解一下深拷贝浅拷贝的概念。
gesse
2020-12-09 15:50:24 +08:00
tcp 是基于字节流、而不是基于消息包的协议。比如 tcpdump 抓到两个 IP 包,包含两个 tcp 数据,但是这两个数据可以在运输层被一次性 copy 到应用层。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/733626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX