谈Socket传输结构体

网上有很多关于Socket结构体传输的文章。

正好前两天在纠结,于是翻开了几篇看。照着方法去做,结果发现不管用抓狂

可能是我太笨了吧。仔细研究发现又一次输给了细节。

由于在定义结构体时我们有两种定义方式

A:struct mystruct a

B:struct mystruct *b

这两种方式的定义在传输中代码是有细微差别的。我具体用我的一个例子说明吧。

#include<dirent.h> //库中定义的文件信息结构体

struct dirent {
ino_t d_ino; /* 索引号 */
off_t d_off; /* 下一个偏移量 */
unsigned short d_reclen; /* 本记录长度 */
unsigned char d_type; /* 文件类型 */
char d_name[256]; /* 文件名 */
};

情况A分析:

struct dirent ptr;//定义结构体

unsigned char dirbuf[sizeof(ptr)];//传输buf
memset(dirbuf, 0x00, sizeof(dirbuf));
while((dirBytes = recv(sockfd, dirbuf, sizeof(dirbuf), 0)) != -1) {
		memcpy(&ptr, dirbuf, sizeof(ptr));//注意此处的代码细节
                ptr.d_name[0];//用“.”方式访问结构体成员


情况B分析:

	struct dirent *ptr;//定义结构体
	unsigned char buf[sizeof(*ptr)];//传输buf

	memset(buf, 0x00, sizeof(buf));
	while((ptr = readdir(dir)) != NULL) {
		memcpy(buf, &(*ptr), sizeof(*ptr)); //注意此处代码细节
                ptr->d_name[0];//用“->”方式访问结构体成员

 
 
 
 
 
 
 

                
在 QT 中,可以使用 `QTcpSocket` 类进行 TCP 传输,而将结构体传输则可以使用 `QDataStream` 类进行序列化和反序列化。 以下是一个简单的示例代码,其中 `MyStruct` 是需要传输结构体: ```c++ struct MyStruct { int a; double b; }; MyStruct myStruct = {1, 2.0}; // 创建 QTcpSocket 对象并连接服务器 QTcpSocket* socket = new QTcpSocket(this); socket->connectToHost("127.0.0.1", 1234); if (socket->waitForConnected()) { // 创建一个 QByteArray 对象 QByteArray block; // 创建一个 QDataStream 对象,将其绑定到 QByteArray 对象上 QDataStream out(&block, QIODevice::WriteOnly); // 设置数据流的版本号 out.setVersion(QDataStream::Qt_5_15); // 将结构体序列化并写入数据流中 out << myStruct; // 将数据流中的数据发送给服务器 socket->write(block); } ``` 在服务器端接收数据时,可以使用类似的方式进行反序列化: ```c++ QTcpSocket* clientConnection = qobject_cast<QTcpSocket*>(sender()); if (clientConnection) { // 读取从客户端发送过来的数据 QByteArray data = clientConnection->readAll(); // 创建一个 QDataStream 对象,将其绑定到 QByteArray 对象上 QDataStream in(&data, QIODevice::ReadOnly); // 设置数据流的版本号 in.setVersion(QDataStream::Qt_5_15); // 读取数据流中的数据并反序列化为结构体 MyStruct myStruct; in >> myStruct; // 处理接收到的结构体数据 qDebug() << "Received struct: " << myStruct.a << myStruct.b; } ``` 在上述代码中,`out << myStruct` 将 `MyStruct` 序列化为二进制格式,并将其写入到 `QByteArray` 中。而 `in >> myStruct` 则从 `QByteArray` 中读取二进制数据,并将其反序列化为 `MyStruct` 对象。注意,在进行序列化和反序列化时,需要使用相同的数据流版本号。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值