2017-04-05 23 views
0

C LinuxでRAWソケットを使用してイーサネットパケットを送信しようとしています。私は構造体を作成したmain構造体をCの文字配列に変換するにはどうすればよいですか?

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; 

:私は私のコードでstruct定義を以下している

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 to this sendbuf ether_headerの後にできるように使用して完全なパケットを送信します。私のコードで他の

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

すべてが働いている、私は1つでsendbuf 1に情報を追加することによって、他の方法を試してみましたが、それが正常に動作し、私のマシンがあまりにも他の側にパケットを受信します。私はちょうどそれがより多くのコマンドと構造体の各コマンドのために一番うまく動作するので、より汎用的にしたい。ありがとう。

答えて

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。 Microsoftにとって

:のgccについては

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

-2

私はこの方法でプロトコルバッファを使っています。https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer& *をご覧ください。

編集:この方法でデータをシリアル化し、データをプロトファイルにシリアル化し、サーバーとクライアントの両方で使用するパケットファイルにコンパイルします。

+0

あなたが共有されているリンクは、Google検索に送信して、あなたは、この情報の使用方法は指定されていません。頼むのではなく、この情報を指定してください。 –

関連する問題