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

时间:2011-10-29 13:02:45

标签: sockets go eof

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

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)
    }
}

输出:

read 1024
read 1024
read 1024
read 1024
read 1024
read 1024
dial read crashed: unexpected EOF

3 个答案:

答案 0 :(得分: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)
}

如果要复制到文件,请使用os.File代替bytes.Buffer

答案 1 :(得分:4)

您还可以从HTTP标头中获取文件的大小,并在套接字上读取该长度。查找Content-Length响应头。

你应该随时了解IO的移动大小,文件和文件的大小,并将读数限制在预期的大小。这样可以避免很多问题。 伪代码:

$size = HTTP_RESPONSE['Content-Length'];
while(reading to $size)
{
    do something with chunk;
}

答案 2 :(得分:3)

该文件不长。它只有412个字节。正弦ReadFull无法读取它返回的所有1024个字节unexpected EOF