- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试从 Go 中的 tcp 连接读取数据。我有一个特定的标题格式,我试图首先解析。所以读取前 12 个字节,其中包含与 header 关联的信息。这告诉我剩余的消息长度是一定数量的字节。在本例中为 1607 字节。我在读取 header 字节的地方尝试了以下代码,然后尝试读取剩余的字节。
import ("net"
log "github.com/sirupsen/logrus"
"bytes"
"encoding/binary"
)
func handleRequest(conn net.Conn) {
// Structs to make header parsing easiers
type encapSTHdrMsgType uint16
type encapSTHdrMsgEncap uint16
type encapSTHdr struct {
MsgType encapSTHdrMsgType
MsgEncap encapSTHdrMsgEncap
MsgHdrVersion uint16
Msgflag uint16
Msglen uint32
}
// Make a buffer to hold header data.
headerBuf := make([]byte, 12)
// Read the incoming header info into the buffer.
_, err := conn.Read(headerBuf)
if err != nil {
log.Debug("Error reading:", err.Error())
}
// Header is in big endian
var header encapSTHdr
headerReader := bytes.NewReader(headerBuf)
err = binary.Read(headerReader, binary.BigEndian, &header)
if err != nil {
log.Debugf("Could not read header bytes into the buffer: %v", err)
}
messageBuf := make([]byte, header.Msglen)
messageBufLen, err := conn.Read(messageBuf)
if err != nil {
log.Debugf("Error reading messages: %s", err.Error())
}
log.Debugf("The message buffer length is: %d", messageBufLen)
log.Debugf("The header message length is: %d", header.Msglen)
}
当我尝试通过创建所需长度为 1607 的新缓冲区来读取剩余字节时,我得到了一个包含数据的新字节数组,但它的长度仅为 1228。因此,我有两个问题:
1) 为什么conn.Read()读不到剩余的字节?
2) 现在我知道我可以使用 for 循环,直到我读取了所需的字节数并在完成时中断,但我想知道是否有更好的方法来做到这一点?
最佳答案
Read当数据可用时返回,而不是当它填满缓冲区时返回。使用 io.ReadFull()读取直到缓冲区已满或从连接读取错误。
_, err := io.ReadFull(conn, headerBuf)
...
_, err := io.ReadFull(conn, messageBuf)
关于go - 在 Go 中使用 conn.Read() 读取前几个字节后,如何继续读取剩余字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52526413/
所以我正在尝试实现类似 Imgur 的功能,非网站成员(member)的用户可以上传并继续编辑该上传内容(直到 cookie 被重置)。 当查看conn结构时,有3个地方出现了用户的cookie。 c
我已经用服务器和客户端完成了一个应用程序,以使用套接字 TCP 发送信息 问题是,如果函数 zfs.ReceiveSnapshot(在服务器端)没有返回错误(err == nil),conn.Writ
经常开发asp但对于细致的说法,真实不太清楚,这里简单的介绍下。 一般情况下 读取数据都是用rs.open sql,conn,1,1 修改数据:rs.open sql,conn,1,3 删除
后 iex -S mix phx.server 我想在 iex 终端做一些快速测试,但有些函数需要 struct %Plug.Conn{} 作为参数,例如我想得到表达式的结果: MyAppWeb.Ro
我正在尝试报告一些代码增强,但是,我不太确定这个项目叫什么。基本上,它不是执行 conn == null,而是执行 null == conn 以提高可读性。 之前: if (conn
这个问题在这里已经有了答案: Is this casting in golang? (1 个回答) What does "i.(string)" actually mean in golang syn
我的代码有点复杂,但简单来说,它有多个 go 例程,所有都调用不同的 TCP 服务器,并在流中出现可读消息时在 for 循环中读取输入。到目前为止,一切都很好。现在有另一个 go 例程来管理之前的一堆
我创建了一个 DBManager 类,如下所示 public class DBManager { public static String DRIVER = "oracle.jdbc.dr
在此处查看 Async/Await 示例: https://github.com/sidorares/node-mysql2/blob/master/documentation/Promise-Wra
在我的一个 Controller 中,我有以下代码(摘录): case HTTPoison.get("https://*****.zendesk.com/api/v2/users/search.jso
conn.execute('some string') 和 SQLAlchemy 中的 conn.execute(text('some string')) 有什么区别? 上面conn是通过conn =
我正在尝试使用btmgmt rust库读取连接的BLE设备的RSSI值,但总是得到127。。我确信该设备已连接,并已解决服务问题,下面是BluToothctl输出:。我尝试使用CLI呼叫btmgmt,
我正在使用MySQL Workbench 。如果我打开一个到 MySQL 的连接(在 Visual Basic 中),它将显示连接已打开。如果我关闭连接(在 MySQL Workbench 中),它会
我在 maven 项目中运行 selenium 测试。这个项目是 GWT Web 应用程序。在 pom.xml 中有 GWT 依赖项,hibernate 依赖项。我在测试包中创建了一个新类来运行 se
我尝试使用 HttpComponentsMessageSender 在 Spring WebServiceTemplate 中设置 ConnectionTimeout 和 ReadTimeout。但是
我刚刚将我的代码从 mysql 更改为 mysqli 并且最好是: 如何避免在每个查询或某些 mysqli 函数中使用 $conn? $conn = mysqli_connect("localhost
执行一条sql查询后,我想访问返回事件的id(主键),以便我可以在另一个sql中使用它。我尝试使用 result.insertId 访问它,但返回的事件对象似乎为 null。我什至控制台记录了 res
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章Asp Conn.execute的参数与返回值总结由作者收集整理,如果你
我正在尝试使用GO与服务进行简单的UNIX套接字通信。为了测试,我创建了一个socket,如下所示: $ nc -vlU /tmp/sock Bound on /tmp/sock Listening
我很难对失败的测试进行故障排除,其中 conn.assigns 都是同一测试语句的一部分,但在测试的两行之间被清空。 我正在阅读“Programming Phoenix”,并重新编写代码以使其与 Ph
我是一名优秀的程序员,十分优秀!