如何在C中将struct转换为char数组?

时间:2017-04-05 00:52:28

标签: c sockets struct packet ethernet

我正在尝试使用C Linux中的RAW套接字发送以太网数据包。我在代码中遵循struct定义:

typedef struct vlink_header_s
{
    uint8_t verCmd;     
    uint8_t reverseVerCmd;
}vlink_header_t;

typedef struct vlink_reg_rd_s
{
    vlink_header_t  header;
    uint32_t        address;
    uint16_t        length;
}vlink_reg_rd_t;

main我创建了一个结构:

vlink_reg_rd_t g_pkt;
g_pkt.header.verCmd = 0x10|VLINK_CMD_REG_RD;
g_pkt.header.reverseVerCmd = ~(g_pkt.header.verCmd);
g_pkt.address = 0x0007 ..... 

和消息:

char sendbuf[1024];
struct ether_header *eh = (struct ether_header *) sendbuf;

如何在ether_header之后将结构 g_pkt 中的所有信息添加到此 sendbuf ,以便我可以使用以下命令发送完整数据包:

sendto(sockfd, sendbuf, txLen, 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll));

我的代码中的其他所有内容都正常工作,我尝试通过其他方式将信息逐个添加到sendbuf,它运行正常,我的机器也收到了另一方的数据包。我只是想让它更通用,因为每个命令都有一堆命令和结构,效果最好。感谢。

2 个答案:

答案 0 :(得分:0)

尝试使用memcpy函数:

#include<iostream>

typedef struct vlink_header_s
{
    uint8_t verCmd;
    uint8_t reverseVerCmd;
}vlink_header_t;

typedef struct vlink_reg_rd_s
{
    vlink_header_s  header;
    uint32_t        address;
    uint16_t        length;
}vlink_reg_rd_t;

using namespace std;
int main()
{
    vlink_reg_rd_t data;

    //TODO: Set values into typedef data.

    int size = sizeof(vlink_reg_rd_t); //get 

    char* buffer = new char[size];
    memset(buffer, 0x00, size);

    memcpy(buffer, &data, size); //Copy data from vlink_reg_rd_t to char*

    //TODO: Send the buffer.

    delete[] buffer; //free memory

    return 0;
}

重要:了解数据类型编号写入缓冲区的顺序。此外,有必要检查数据是否与结构对齐,以避免在使用时{!1}}增加额外的字节数。在这里,您可以查看以下主题:

for Microsoft:

https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx https://msdn.microsoft.com/en-us/library/83ythb65.aspx

对于Gcc:

https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html

答案 1 :(得分:-2)

我用协议缓冲区这样做了,你可以看看:https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer& *。

编辑:这种方式称为序列化数据,当您将数据序列化为原型文件,然后将其编译为您在服务器和客户端上使用的数据包文件。