插槽 – golang:从套接字读取时意外的EOF

前端之家收集整理的这篇文章主要介绍了插槽 – golang:从套接字读取时意外的EOF前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下简单的golang程序来下载Google的隐私政策.不幸的是,即使文件长得多,它总是在错误的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)
    }
}

输出

read 1024
read 1024
read 1024
read 1024
read 1024
read 1024
dial read crashed: unexpected EOF
函数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.

猜你在找的Go相关文章