当前位置:   article > 正文

TCP/IP 中多种不同数据类型的传输--使用结构体_tcp/ip send()函数能发送结构体吗

tcp/ip send()函数能发送结构体吗

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

typedef struct Data {
    int list[10];//数据
    long long currentTime;//当前时间戳
}Data;
  • 1
  • 2
  • 3
  • 4
  • 5

思想

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); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

接收方

代码如下:

//同样需要定义字符串和相同的结构体对象 
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/147063
推荐阅读
相关标签
  

闽ICP备14008679号