go - 读取 net.Conn 缓冲区的第一个 UVarInt

标签 go tcp tcpserver

我有一个通过监听端口设置的 TCP 数据包连接 (net.Conn)。

conn, err := ln.Accept()

我需要读取 Conn.Read([]byte) 缓冲区的第一个 UVarInt,它从索引 0 开始。

以前,我只需要第一个字节,这很容易使用

packetSize := make([]byte, 1)
conn.Read(packetSize)
// Do stuff with packetSize[0]

但是,如前所述,我需要使用 net.Conn.Read() 方法获取我可以到达的第一个 UVarInt。请记住,UVarInt 几乎可以有任何长度,我不能确定这一点(客户端不发送 UVarInt 的大小)。但是我知道 UVarInt 从缓冲区的最开始开始。

最佳答案

bufio.Reader 包装连接:

br := bufio.NewReader(conn)

使用二进制包到read an unsigned varint通过 bufio.Reader:

n, err := binary. ReadUvarInt(br)

因为 bufio.Reader 比 varint 可以缓冲更多,所以您应该使用 bufio.Reader 进行连接上的所有后续读取。

关于go - 读取 net.Conn 缓冲区的第一个 UVarInt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35786264/

相关文章:

go - 像谷歌地球一样重新着色图标

Go:嵌入原始类型?

tcp - 为什么 socat 在连接到 Web 服务器时需要 "fork"?

vb.net - VB.Net UDP 与 TCP 中的文件传输应用程序和

unity3d - 使用 WebGL Unity 连接到 TCP 服务器

tcp - 在 EC2 实例上扩展 TCP 服务器的分布式问题

ruby - Ruby后台TCP服务器

arrays - 在 go 中循环 slice/数组的有效方法

go - 这是基于消息总线的发布-订阅模式吗?

sockets - gen_tcp :recv/2 returns error, einval