go - 写入特定的 bytes.Buffer 偏移量

标签 go tcp

我正在尝试编写一个游戏服务器并且需要创建我将发送回客户端的数据包。我正在将所有数据写入 bytes.Buffer 然后我想在获取字节并将其发送到客户端之前为数据包的总大小添加前缀。

我在想这样的事情:

// is it bad to call `var b bytes.Buffer` every time I create a packet?
func CreatePacket() []byte {
  var b bytes.Buffer

  // size
  binary.Write(b, binary.LittleEndian, 0) // insert at end

  // body (variable number of writes)
  binary.Write(b, binary.LittleEndian, data)

  // update the size at offset 0
  binary.Write(b, binary.LittleEndian, b.Len())

  return b.Bytes()
}

但我找不到任何方法来寻找或修改偏移量。


这行不通,为什么?

var packet = b.Bytes()

// the size is really at offset 2. offset 0 is an ID.
binary.LittleEndian.PutUint16(packet, uint16(0xF3))
binary.LittleEndian.PutUint16(packet, uint16(len(packet)))

最佳答案

您可以在组装数据包后将长度直接写入 slice 。您还需要指定长度前缀大小,以便跨平台时它是相同的。

func CreatePacket(data []byte) []byte {
    // leave 4 bytes at the start for the ID and length
    b := bytes.NewBuffer(make([]byte, 4))

    binary.Write(b, binary.LittleEndian, data)
    packet := b.Bytes()

    // insert the ID and prefix
    binary.LittleEndian.PutUint16(packet, uint16(0xF3))
    binary.LittleEndian.PutUint16(packet[2:], uint16(len(packet)))
    return packet
}

https://play.golang.org/p/35IX1c18a4

关于go - 写入特定的 bytes.Buffer 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41810188/

相关文章:

c# - TCP speed tester 算法题

go - 在其中一个部分中执行带有空格的命令

go - 为什么这个循环被认为是数据竞争[Golang]

mysql - Golang Mysql扫描返回零,当数据存在时?

tcp - 通过tcp连接打开优化协议(protocol)打开操作

.net - 立即检测客户端与服务器套接字的断开连接

go - 从嵌套 block 返回,范围问题

go - 并发写入 websocket 连接

sockets - UDP 数据包丢失(LAN-Netcat),切换服务器-客户端数据包正常

c - 了解用于接收 UDP 消息和打开 TCP 套接字的 Select 循环