欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP 中多种不同数据类型的传输--使用结构体

程序员文章站 2022-03-04 22:16:16
...

这两天在弄TCP/IP通信,原本直接用字节一个一个自己组装并且转换格式,麻烦不说更容易出错。因此看到有人介绍这种方法,我试了一下发现确实很好;因此记录下来,方便下次查阅!!!
假设需要传送的结构体如下:

typedef struct Data {
    int list[10];//数据
    long long currentTime;//当前时间戳
}Data;

思想

TCP是无边界的字节流传输,所以需要将结构体转换为字符串后在发送,在发送数据的地方对数据进行处理,将其转换成一个字符串/结构体进行传送,而在接受方定义相同的结构体对这个字符串或者结构体进行解析即可。

发送方

代码如下:

int list[10] = { 300,300,330,300,330,300,330,300,330,300 };
char buffer[BUFFER_SIZE];//传送的字符串
struct Data data;//声明一个需要传送的结构体
for (int i = 0; i < 10; i++) {
                data.list[i] = list[i];
            }
 data.currentTime = GetTickCount();
cout << "当前时间 :" << data.currentTime << endl;
memcpy(buffer, &data, sizeof(Data)); //把这个结构体中的信息从内存中读入到字符串buffer中 
return_info = send(s_Host, buffer, sizeof(Data), 0); 

接收方

代码如下:

//同样需要定义字符串和相同的结构体对象 
char buffer[100]; //传送的字符串 
struct Data data;//声明一个存放接收信息的结构体 
memset(buffer, 0, sizeof(buffer)); //清内存
memset(&data, 0, sizeof(data));
//下面是接收字符串的代码   
//第一个参数指客户端(另一端,绑定的是客户端的IP地址和端口)套接字描述符;第二个参数指明一个缓冲区,
//该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。
err_code = recv(sClient, buffer, sizeof(buffer), 0);
//下面对字符串信息进行还原,将其变成我们的结构体数据 
memcpy(&data, buffer, sizeof(data)); //data发送到了这边的data
//输出显示收到的数据是否正确
for (int i = 0; i < 10; i++)
{
    cout << data.list[i] << " ";
}
cout << endl;
cout << data.currentTime << endl;
相关标签: tcp ip