2017-04-05 91 views
0

我想在C Linux中使用RAW套接字发送以太网数据包。我在我的代码如下struct定义:如何将结构转换为C中的char数组?

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; 

如何添加的所有信息从结构g_pkt到这个sendbuf after ether_header所以我可以利用发送完整的数据包:

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

一切都在我的代码别的工作,我尝试过其他方法通过增加信息,以sendbuf一个接一个,它工作正常,我的机器接收数据包的另一边了。我只是想让它更通用,因为每个命令都有一堆命令和结构,效果最好。谢谢。

回答

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; 
} 

重要:注意在其中的数据类型数量的写入缓冲器的数量级。此外,还需要检查将数据对齐到结构中以避免使用memcpy时的额外字节。在这里,您可以检查这个话题:

微软:

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

海合会:

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