为了账号安全,请及时绑定邮箱和手机立即绑定

多个串行请求导致空缓冲区

多个串行请求导致空缓冲区

Go
阿晨1998 2022-06-01 17:43:45
在 osx 上的 localhost 上运行的第一个 TCP 连接始终会正确解析发送给它的二进制文件。后续请求丢失二进制数据,只看到第一个字节 [8]。我如何设置阅读器失败?package mainimport (        "fmt"        "log"        "net"        "os"        "app/src/internal/handler"        "github.com/golang-collections/collections/stack")func main() {        port := os.Getenv("SERVER_PORT")        s := stack.New()        ln, err := net.Listen("tcp", ":8080")        if err != nil {                log.Fatalf("net.Listen: %v", err)        }        fmt.Println("Serving on " + port)        for {                conn, err := ln.Accept()                // defer conn.Close()                if err != nil {                        log.Fatal("ln.Accept")                }                go handler.Handle(conn, s)        }}package handlerimport (        "fmt"        "io"        "log"        "net"        "github.com/golang-collections/collections/stack")func Handle(c net.Conn, s *stack.Stack) {        fmt.Printf("Serving %s\n", c.RemoteAddr().String())        buf := make([]byte, 0, 256)        tmp := make([]byte, 128)        n, err := c.Read(tmp)        if err != nil {                if err != io.EOF {                        log.Fatalf("connection Read() %v", err)                }                return        }        buf = append(buf, tmp[:n]...)}日志:Serving [::1]:51699 ------------- value ---------------:QCXhoy5tBuffer Length: 9. First Value: 8Serving [::1]:51700------------- value ---------------:Buffer Length: 1. First Value: 8Serving [::1]:51701测试发送过来:push random string:QCXhoy5tpush random string:GPh0EnbSpush random string:4kJ0wN0R
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

Reader的文档说:


Read reads up to len(p) bytes into p. It returns the number of bytes read (0 <= n 

<= len(p)) and any error encountered. Even if Read returns n < len(p), it may use 

all of p as scratch space during the call. If some data is available but not 

len(p) bytes, Read conventionally returns what is available instead of waiting 

for more.

因此,问题的最可能原因是 Read 正在返回可用的数据(在本例中为单个字符)。您可以通过使用ioutil.ReadAll或在循环中执行读取来解决此问题(数据被添加到缓冲区的事实使它看起来像是最初的意图),例如:


for {

    n, err := c.Read(tmp)

    if err != nil {

        if err != io.EOF {

            // Note that data might have also been received - you should process that

            // if appropriate.

            log.Fatalf("connection Read() %v", err)

            return

        }

        break // All data received so process it

    }

    buf = append(buf, tmp[:n]...)

}

注意:不保证收到任何数据;您应该在尝试访问它之前检查长度(即buf[0]可能会恐慌)


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信