2017-04-05 105 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