gpt4 book ai didi

go - 当我得到的只是来自 net.TCPConn 的 EOF 时,我如何知道连接是否已断开?

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

godocs 说:

“EOF 是当没有更多输入可用时 Read 返回的错误。函数应该只返回 EOF 以表示输入的正常结束。如果 EOF 在结构化数据流中意外出现,则相应的错误是 ErrUnexpectedEOF 或某些提供更多详细信息的其他错误。”

在我的程序中,我喜欢喜欢得到ErrUnexpectedEOF,但我没有。即使客户端在发送文件的过程中终止,我也总是只收到 EOF。

所以,我卡住了。通过最后发送 EOF 传输 100% 的成功文件。并且错误退出 50% 的文件也会发送 EOF 作为错误。我不知道传输前文件的总大小。

我是否可以从 net.TCPConn 获得更多信息以了解该文件是否完整?

最佳答案

TCP 是一种流式传输协议(protocol);字节流。这就是为什么要在 TCP 上发明/实现文件传输协议(protocol),例如 FTP(文件传输协议(protocol))。

但是(不推荐/思想实验)如果您可以以不包含特定字符/字节的 block 形式发送文件(例如 base64 +\n 作为特定字符),那么您可以使用该特定字符作为分隔符。

现在,如果我们使用与此类似的函数来处理我们的连接:

func (srv *Server) handler(conn net.Conn) {
//...

defer srv.closeConnection(conn, nil)

reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)

//...

conn.SetDeadline(time.Now().Add(conf.ClientTimeout))

for {
select {
case <-conf.QuitSignal:
return
default:
line, err := reader.ReadBytes('\n')
if err != nil {
return
}

//...
}

conn.SetDeadline(time.Now().Add(conf.ClientTimeout))
}
}

func (srv *Server) closeConnection(conn net.Conn, err error) {
conn.Close()
//...
}

Reader.ReadBytes 的文档中我们读到ReadBytes 返回 err != nil 当且仅当返回的数据不以分隔符结尾。这样我们就可以识别损坏的 block 。

关于go - 当我得到的只是来自 net.TCPConn 的 EOF 时,我如何知道连接是否已断开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39710874/

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