2017-04-05 1 views
0

J'essaie d'envoyer un paquet ethernet en utilisant le socket RAW dans C Linux. Je suit struct définition dans mon code:Comment convertir un tableau struct to char en 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; 

Dans main i créé une 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 ..... 

et un message:

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

comment puis-je ajouter toutes les informations de la struct g_pkt à ce sendbuf après ether_header afin que je puisse envoyer un paquet complet en utilisant:

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

Tout le reste dans mon code fonctionne, j'ai essayé d'autres moyens en ajoutant d'information à sendbuf un par un et il fonctionne très bien et ma machine recevoir les paquets de l'autre côté aussi. Je veux juste le rendre plus polyvalent parce qu'il y a un tas de commandes et de structs pour chaque commande qui fonctionnera le mieux. Merci.

Répondre

0

Essayez d'utiliser la fonction 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; 
} 

IMPORTANT: être au courant de l'ordre dans lequel nombre de types de données sont écrites dans la mémoire tampon. Il est également nécessaire de vérifier l'alignement des données dans la structure pour éviter les octets supplémentaires au moment de l'utilisation memcpy. Ici, vous pouvez consulter ce sujet:

pour Microsoft:

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

pour gcc:

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

-2

Je l'ai fait de cette façon avec le tampon de protocole, vous pouvez jeter un oeil à: https://www.google.com.vn/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protocol+buffer& *. Edit: cette méthode s'appelle sérialiser les données, lorsque vous sérialisez vos données dans un fichier proto, puis le compilez dans le fichier packet que vous utilisez à la fois sur le serveur et sur le client.

+0

Le lien que vous partagiez envoie à une recherche google et vous êtes pas précisé comment utiliser cette information. S'il vous plaît, spécifie cette information au lieu de demander. –