Go TCPConn.Write 方法

2021-11-23 08:48:43 +08:00
 FreeWong
假设这里的代码是客户端
```
tcpConn.SetWriteDeadline(time.Now().Add(5 * time.Second))
n, err = tcpConn.Write([]byte(data))
if err != nil {
log.Println("写到缓冲区时错误", err)
return
}
```
前提,客户端和服务端定义严格的自定义通讯格式如下 前 4 个字节表示后面所有数据的长度 后跟内容 如上代码 如果五秒后超时后,返回的 n 是已经发送到缓冲区中的字节数,如果我一共要发送 64 个字节,但是这个返回的 n 是 3,则还有 61 个字节未发送,同时 3 个字节已经在缓冲区,此时该怎么办?

这 3 个节操作系统还是发送到对端,服务端收到一段不完整的数据 同时,好像 tcpconn 也没有清空发送缓冲区的方法 即使有 清空缓冲区的话 也会将原来处在缓冲区中的以前的完整的数据清空掉 ,这样也不合理.

你们怎么处理这种情况呢 感谢
1216 次点击
所在节点    问与答
6 条回复
joesonw
2021-11-23 09:55:06 +08:00
Write 失败一般直接 Close 掉
sujin190
2021-11-23 10:05:57 +08:00
所以服务端先循环读直到读取到 4 个字节解析出长度,然后再循环读直到读取到前面解析出的长度为止啊,客户端也是,没写全,就循环写后续数据就是了,做个切片就可以取出剩下的数据就是了,而且 go 的 write 缓冲区满了是阻塞写的
zhangsanfeng2012
2021-11-23 10:52:41 +08:00
错包丢掉就可以了吧
fuis
2021-11-23 14:48:30 +08:00
Write 失败一般直接 Close 掉
cppc
2021-11-23 18:08:57 +08:00
一般做法不是无脑发数据,要 socket 可写才发,服务端消费不了你发不出去。
FreeWong
2021-11-29 14:12:33 +08:00
@cppc @zhangsanfeng2012 @fuis 已经在缓冲区中的怎么办?

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

https://www.v2ex.com/t/817284

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

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

© 2021 V2EX