C++ socket 传输不同类型数据的四种方式

使用socket传输组织好的不同类型数据,有四种不同的方式(我知道的嘿嘿):

a. 结构体

b. Json序列化

c. 类对象

d. protobuf

下面逐一整理一下,方便以后进行项目开发。

 

1. 使用结构体

   假设需要传送的结构体如下:

struct person
{
   char name[20];     // 注意:CPU访问内存的时候,对访问地址有对齐的要求,一般为2的幂次方。所以,有的数据被填充,以满足对齐要求。
   int age;
   float high;
};

  可在发送数据的地方对数据进行处理,将其转换成一个字符串进行传送,而在接受方定义相同的结构体对这个字符串进行解析即可。

  发送方代码:

char temp[100];    //传送的字符串
struct person p1; //声明一个需要传送的结构体
//以下是结构体的初始化信息
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
memset(temp,0,sizeof(temp));         // 对该内存段进行清
memcpy(temp,&p1,sizeof(person));     // 把这个结构体中的信息从内存中读入到字符串temp中
//接下来传送temp这个字符串就可以了 
send(sock,temp,sizeof(person),0);

  或者

struct person p1; //声明一个需要传送的结构体
p1.age = 10;
p1.high = 1.80f;
strcpy(p1.name,"zhangsan",sizeof(p1.name));
 
send(sock,(char*)&p1,sizeof(person),0);

  接收方代码:

  同样需要定义字符串和相同的结构体对象

char temp[100];    
struct person p2;  
memset(temp, 0, sizeof(temp)); 

recv(clientSocket, temp, 101, 0);
memcpy(&p2,temp,sizeof(person));  
//或者
recv(clientSocket, (char*)&p2, sizeof(person),0);

2. 使用Json序列化

   有时间写

3. 使用类对象

   有时间写

4. protobuf

 

转载于:https://www.cnblogs.com/lvchaoshun/p/6535992.html

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++传输图像,可以使用Socket编程。以下是一些基本步骤: 1. 在发送端,将图像读取到内存中,并将其转换为字节数组。 2. 将字节数组发送到接收端,可以使用TCP或UDP协议。如果使用TCP协议,则可以使用套接字中的send()函数发送数据。如果使用UDP协议,则可以使用sendto()函数。 3. 在接收端,接收到字节数组后,将其转换回图像格式,并保存到文件系统中。 这里是一个简单的示例代码,用于在两个计算机之间传输图像: 发送端代码: ``` #include <iostream> #include <fstream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main() { // 创建套接字 int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { cerr << "Error creating socket" << endl; return -1; } // 设置服务器地址和端口号 struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12345); serverAddr.sin_addr.s_addr = inet_addr("192.168.1.100"); // 连接服务器 if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { cerr << "Error connecting to server" << endl; return -1; } // 读取图像到内存中 ifstream file("image.jpg", ios::binary | ios::ate); streamsize size = file.tellg(); file.seekg(0, ios::beg); char* buffer = new char[size]; if (file.read(buffer, size)) { cout << "Image loaded into memory" << endl; } // 发送数据 if (send(sock, buffer, size, 0) < 0) { cerr << "Error sending data" << endl; return -1; } // 关闭套接字 close(sock); delete[] buffer; return 0; } ``` 接收端代码: ``` #include <iostream> #include <fstream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> using namespace std; int main() { // 创建套接字 int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { cerr << "Error creating socket" << endl; return -1; } // 绑定端口号和地址 struct sockaddr_in serverAddr, clientAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12345); serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { cerr << "Error binding socket" << endl; return -1; } // 监听套接字 listen(sock, 1); // 接受连接 socklen_t clientAddrLen = sizeof(clientAddr); int clientSock = accept(sock, (struct sockaddr*)&clientAddr, &clientAddrLen); if (clientSock < 0) { cerr << "Error accepting connection" << endl; return -1; } // 接收数据 char buffer[1024]; int bytesRead = recv(clientSock, buffer, sizeof(buffer), 0); if (bytesRead < 0) { cerr << "Error receiving data" << endl; return -1; } // 将字节数组转换为图像格式 ofstream file("image.jpg", ios::binary); file.write(buffer, bytesRead); cout << "Image saved to disk" << endl; // 关闭套接字 close(clientSock); close(sock); return 0; } ``` 注意:这只是一个简单的示例代码,需要根据实际情况进行修改和完善。例如,可以增加错误处理和数据校验等功能,以确保数据的完整性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值