来自net.TCPConn的Golang Read Bytes

时间:2015-03-23 22:48:18

标签: tcp go

是否有ioutil.ReadAll的版本在读取到EOF之前读取,或者如果它读取n个字节(以先到者为准)?

出于DOS原因,我不能从n转储中获取第一个ioutil.ReadAll字节。

3 个答案:

答案 0 :(得分:2)

有几种方法可以满足您的要求。你可以使用任何一个。

func ReadFull

func ReadFull(r Reader, buf []byte) (n int, err error)
  

ReadFull从r读取正好len(buf)个字节到buf。它返回   复制的字节数,如果读取的字节数较少则出错。该   只有在没有读取字节时,错误才是EOF。

func LimitReader

func LimitReader(r Reader, n int64) Reader

LimitReader返回一个从r读取但在n个字节后用EOF停止的Reader。底层实现是* LimitedReader。

func CopyN

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
  

CopyN将n个字节(或直到错误)从src复制到dst。它回来了   复制的字节数和遇到的最早错误   复制。返回时,写入== n当且仅当err == nil。

func ReadAtLeast

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
  

ReadAtLeast从r读取到buf,直到它读取至少min   字节。它返回复制的字节数,如果更少则返回错误   读取了字节数。只有在没有读取字节时,错误才是EOF。

答案 1 :(得分:1)

io.ReadFull 要么 io.LimitedReader 要么 http.MaxBytesReader

如果您需要先了解一些不同的东西,那么通过调整行为来推动自己的实施是微不足道的。

答案 2 :(得分:1)

有两种选择。如果n是您要读取的字节数,则r是连接。

选项1:

p := make([]byte, n)
_, err := io.ReadFull(r, p)

选项2:

p, err := io.ReadAll(&io.LimitedReader{R: r, N: n})

如果应用程序通常填充缓冲区,则第一个选项更有效。

如果您正在阅读HTTP请求正文,请使用http.MaxBytesReader