插槽 – 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.

相关文章

程序目录结构 简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息...
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简...
简介 默克尔树(MerkleTree)是一种典型的二叉树结构,其主要特点为: 最下面的叶节点包含存储数据或其...
接下来学习并发编程, 并发编程是go语言最有特色的地方, go对并发编程是原生支持. goroutine是go中最近本...
先普及一下, 什么是广度优先搜索 广度优先搜索类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶...
第一天: 接口的定义和实现 第二天: 一. go语言是面向接口编程. 在学习继承的时候说过, go语言只有封装,...