gpt4 book ai didi

golang 从 net.TCPConn 中以 4 个字节作为消息分隔读取字节

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:23 26 4
gpt4 key购买 nike

我正在 golang 中开发 SIP over TCP 模拟服务。传入的 SIP 消息由 '\r\n\r\n' 序列分隔(我现在不关心 SDP)。我想根据该分隔符提取消息并将其发送到处理 goroutine。通过 golang 标准库,我看不到实现它的简单方法。 iobufio 包似乎没有一站式服务。目前我看到两个前进的选择 (bufio):

  1. *Reader.ReadBytes 函数,'/r' 设置为分隔符。进一步的处理是通过使用 ReadByte 函数并将其与定界符的每个字节按顺序进行比较并在必要时取消读取它们来完成的(这看起来很乏味)

  2. 将 Scanner 与自定义拆分功能结合使用,这看起来也不是太琐碎。

我想知道是否还有其他更好的选择,功能似乎很常见,很难相信仅仅为 tcp 流定义定界符并从中提取消息是不可能的。

最佳答案

您可以选择自己缓冲读取并在 \r\n\r\n 分隔符上拆分,或者让 bufio.Scanner 为你。实现 scanner.SplitFunc 并不困难,而且它绝对比替代方案更简单。以 bufio.ScanLines 为例,您可以使用:

scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
delim := []byte{'\r', '\n', '\r', '\n'}
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := bytes.Index(data, delim); i >= 0 {
return i + len(delim), data[0:i], nil
}
if atEOF {
return len(data), data, nil
}
return 0, nil, nil
}

关于golang 从 net.TCPConn 中以 4 个字节作为消息分隔读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41252089/

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