当我得到的是来自net.TCPConn的EOF时,我如何知道连接是否已被删除?

时间:2016-09-26 19:29:56

标签: go tcp ftp

godocs说:

"当没有更多输入可用时,EOF是Read返回的错误。函数应仅返回EOF以指示输入的正常结束。如果在结构化数据流中意外发生EOF,则相应的错误是ErrUnexpectedEOF或其他一些错误,提供更多细节。"

在我的节目中我会love喜欢得到ErrUnexpectedEOF,但我不知道。即使客户端在发送文件的过程中终止,我也总是得到EOF。

所以,我被困住了。通过发送EOF结束100%传输的成功文件。通过错误退出50%的文件也会发送EOF作为错误。我不知道转移前文件的总大小。

我是否可以从网上获取更多信息.TCPConn知道这是一个完整的文件吗?

1 个答案:

答案 0 :(得分:1)

TCP是一种流媒体协议;一个字节流。这就是为什么在TCP上发明/实现文件传输协议的原因,如FTP(文件传输协议)。

但是(不推荐/思考实验)如果您可以以不包含特定字符/字节的块(例如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返回错误!= nil 当且仅当返回的数据不以分隔符结尾时。通过这种方式,我们可以识别出破碎的块。