【问题标题】:How to convert struct to char array in C?如何在C中将struct转换为char数组?
【发布时间】:2017-04-19 03:32:19
【问题描述】:

我正在尝试在 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,它工作正常,我的机器也接收到另一端的数据包。我只是想让它更加通用,因为每个命令都有一堆命令和结构将最有效。谢谢。

【问题讨论】:

    标签: c sockets struct packet ethernet


    【解决方案1】:

    尝试使用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;
    }
    

    重要提示:注意数据类型编号写入缓冲区的顺序。此外,有必要检查将数据对齐到结构中以避免在使用memcpy 时出现额外字节。在这里你可以检查这个主题:

    对于微软:

    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

    【讨论】:

      【解决方案2】:

      我已经用protocol buffer做了这种方式,你可以看看:https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer&*。

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

      【讨论】:

      • 您共享的链接发送到谷歌搜索,但未指定如何使用此信息。请指定此信息而不是要求。
      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多