gpt4 book ai didi

go - 在 Go 中使用 conn.Read() 读取前几个字节后,如何继续读取剩余字节?

转载 作者:IT王子 更新时间:2023-10-29 00:54:57 30 4
gpt4 key购买 nike

我正在尝试从 Go 中的 tcp 连接读取数据。我有一个特定的标题格式,我试图首先解析。所以读取前 12 个字节,其中包含与 header 关联的信息。这告诉我剩余的消息长度是一定数量的字节。在本例中为 1607 字节。我在读取 header 字节的地方尝试了以下代码,然后尝试读取剩余的字节。

import ("net"
log "github.com/sirupsen/logrus"
"bytes"
"encoding/binary"
)

func handleRequest(conn net.Conn) {

// Structs to make header parsing easiers
type encapSTHdrMsgType uint16
type encapSTHdrMsgEncap uint16
type encapSTHdr struct {
MsgType encapSTHdrMsgType
MsgEncap encapSTHdrMsgEncap
MsgHdrVersion uint16
Msgflag uint16
Msglen uint32
}

// Make a buffer to hold header data.
headerBuf := make([]byte, 12)

// Read the incoming header info into the buffer.
_, err := conn.Read(headerBuf)
if err != nil {
log.Debug("Error reading:", err.Error())
}

// Header is in big endian
var header encapSTHdr
headerReader := bytes.NewReader(headerBuf)
err = binary.Read(headerReader, binary.BigEndian, &header)
if err != nil {
log.Debugf("Could not read header bytes into the buffer: %v", err)
}

messageBuf := make([]byte, header.Msglen)
messageBufLen, err := conn.Read(messageBuf)
if err != nil {
log.Debugf("Error reading messages: %s", err.Error())
}
log.Debugf("The message buffer length is: %d", messageBufLen)
log.Debugf("The header message length is: %d", header.Msglen)
}

当我尝试通过创建所需长度为 1607 的新缓冲区来读取剩余字节时,我得到了一个包含数据的新字节数组,但它的长度仅为 1228。因此,我有两个问题:

1) 为什么conn.Read()读不到剩余的字节?

2) 现在我知道我可以使用 for 循环,直到我读取了所需的字节数并在完成时中断,但我想知道是否有更好的方法来做到这一点?

最佳答案

Read当数据可用时返回,而不是当它填满缓冲区时返回。使用 io.ReadFull()读取直到缓冲区已满或从连接读取错误。

_, err := io.ReadFull(conn, headerBuf)

...

_, err := io.ReadFull(conn, messageBuf)

关于go - 在 Go 中使用 conn.Read() 读取前几个字节后,如何继续读取剩余字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52526413/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com