学校网站模板html下载,公众号取名神器,商丘网站建设哪家好,关键词热度查询工具将结构体当二进制流传输是做网络编程时传输协议的常用功能。golang语言可以使用包 encoding/binary实现#xff0c;例如 import (encoding/binaryos
)...
err : binary.Write(f, binary.LittleEndian, p)
...rust中可以使用 deku将结构体实例转换为by…将结构体当二进制流传输是做网络编程时传输协议的常用功能。golang语言可以使用包 encoding/binary实现例如 import (encoding/binaryos
)...
err : binary.Write(f, binary.LittleEndian, p)
...rust中可以使用 deku将结构体实例转换为bytes数组。
安装依赖
use anyhow;
use anyhow::bail;
use deku::prelude::*;
use std::net::TcpStream;
use std::{io::{Read, Write},
};定义结构体
#[derive(Debug, PartialEq, DekuRead, DekuWrite, Default)]
struct Message {#[deku(endian big)]msgtype: u32,#[deku(endian big)]taskid: i32,#[deku(endian big)]utctime: u32,#[deku(endian big, update self.data.len())]bodylen: u32,#[deku(count bodylen, endian little)]data: Vecu8,
}注意上面的结构体整数字段有些是使用大段规则有些是使用小段规则可以通过如下的宏实现
#[deku(endian big)] 或#[deku(endian little)]通常在定义协议时需要知道协议体的长度但是协议的body部分通常是可变的例如data: Vecu8只有在结构体初始化时才知道body的长度所以这里使用如下宏延迟计算了协议的长度如下
#[deku(endian big, update self.data.len())]
#[deku(count bodylen, endian little)]将结构体转换为字节流发送
添加如下宏后
#[derive(Debug, PartialEq, DekuRead, DekuWrite, Default)]则可以调用 to_bytes()方法进行转换。
将转换后的二进制发送到tcp服务器如下
impl Message {fn send(self) - anyhow::Result() {// 将结构体转换为二进制let binary_data self.to_bytes()?;// tcp发送二进制消息let mut stream match TcpStream::connect(self.host) {Ok(stream) stream,Err(e) {bail!(Couldnt connect to server {} {},self.host,e)}};stream.write_all(binary_data)?;stream.flush()?;Ok(())}
}