我尝试从TLS连接读取文件,但只能读取4096个字节(n = 4096)。如何读取完整文件?
reader := bufio.NewReader(pc.conn)
msg := make([]byte, 10*1024*1024)
n,err:=reader.Read(msg)
答案 0 :(得分:1)
io.Reader.Read(p []byte)
—如果成功,则可以自由返回1到len(p)
之间的任意数量的字节;这是
its contract:
Read最多将
len(p)
个字节读入p
。它返回读取的字节数(0 <= n <= len(p)
)和遇到的任何错误。即使Read
返回n < len(p)
,它也可能在呼叫过程中将所有p用作临时空间。如果某些数据可用,但没有len(p)
字节,则Read
通常会返回可用数据,而不是等待更多数据。
(强调我的。)
您正在观察的“幻数” 4096可能是TLS连接下某些软件的缓存大小。
这实际上与read(2)
POSIX syscall的合同匹配
(对于套接字,它实际上是recv(2)
-来自Go所支持的每个平台(包括Windows)所实现的“ BSD套接字”; its counterpart from Winsock具有相同的语义FWIW)。
如果确切知道需要从源中读取多少字节,请使用io.ReadFull
帮助器。
这通常是处理数据的最简单方法
以类似TLV的格式编码(encoding/binary
也有帮助)。