为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 从 net.TCPConn 读取字节

Golang 从 net.TCPConn 读取字节

Go
MMTTMM 2021-09-27 10:35:32
是否有一个版本ioutil.ReadAll会读取直到到达 EOF 或读取n字节(以先到者为准)?由于 DOS 原因,我不能只n从ioutil.ReadAll转储中获取第一个字节。
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

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

函数读取完整

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

ReadFull 将 len(buf) 字节从 r 准确读取到 buf 中。如果读取的字节数较少,则返回复制的字节数和错误。仅当未读取字节时,错误才为 EOF。

功能限制阅读器

func LimitReader(r Reader, n int64) Reader

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

功能复制N

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

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

函数读取至少

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

ReadAtLeast 从 r 读取到 buf 中,直到读取至少 min 个字节。如果读取的字节数较少,则返回复制的字节数和错误。仅当未读取字节时,错误才为 EOF。


查看完整回答
反对 回复 2021-09-27
?
holdtom

TA贡献1805条经验 获得超10个赞

有两种选择。Ifn是您要读取的字节数,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


查看完整回答
反对 回复 2021-09-27
?
慕容708150

TA贡献1831条经验 获得超4个赞

io.ReadFull 或 io.LimitedReader 或 http.MaxBytesReader

如果你需要一些不同的东西,首先看看它们是如何实现的,用调整过的行为来推出你自己的东西是微不足道的。


查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 546 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信