Go:从套接字读取时出现意外的EOF

aar*_*nsw 15 sockets go eof

我有以下简单的golang程序来下载Google的隐私政策.不幸的是,unexpected EOF在读取6861字节后,它总是会因错误而崩溃,即使文档更长.为什么?

package main

import "net"
import "fmt"
import "io"
import "os"

func die(msg string, s os.Error) {
    fmt.Printf("%s crashed: %v\n", msg, s)
    os.Exit(1)
}

func main() {
    fd, err := net.Dial("tcp", "google.com:80")
    if err != nil { die("dial", err) }

    req := []byte("GET /intl/en/privacy/ HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
    _, err = fd.Write(req)
    if err != nil { die("dial write", err) }

    buf := make([]byte, 1024)
    nr := 1

    for nr > 0 {
        nr, err = io.ReadFull(fd, buf)
        if err != nil { die("dial read", err) }
        fmt.Printf("read %d\n", nr)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

read 1024
read 1024
read 1024
read 1024
read 1024
read 1024
dial read crashed: unexpected EOF
Run Code Online (Sandbox Code Playgroud)

小智 11

io.ReadFull(fd, buf)仅当您知道fd可以提供至少 len(buf)字节数时,才应使用该函数.

相反,请尝试以下方法:

var buf bytes.Buffer

nr, err := io.Copy(&buf, fd)
if err != nil {
    die("dial read", err)
}
Run Code Online (Sandbox Code Playgroud)

如果要复制到文件,请使用os.File而不是bytes.Buffer.