C - la Rédaction des structures dans un fichier (.ppce)

Je suis en train d'écrire une .fichier pcap, qui est quelque chose qui peut être utilisé dans Wireshark.
Pour ce faire, j'ai un couple de structures avec différents types de données j'ai besoin d'écrire dans un fichier. (voir le code)

Donc, j'ai créer la structure des instances, remplissez les données, utilisez FILE* fp = fopen("test.ppce","w"), et puis je suis pas sûr de la façon de bien l'écrire dans le fichier. Je crois que je dois utiliser memcpy mais je ne suis pas sûr de la meilleure façon de le faire. J'ai surtout eu recours à des bibliothèques C++ dans le passé pour ce faire. Des suggestions?

typedef struct pcap_hdr_s {
        uint32_t magic_number;   /* magic number */
        uint16_t version_major;  /* major version number */
        uint16_t version_minor;  /* minor version number */
        int32_t  thiszone;       /* GMT to local correction */
        uint32_t sigfigs;        /* accuracy of timestamps */
        uint32_t snaplen;        /* max length of captured packets, in octets */
        uint32_t network;        /* data link type */
} pcap_hdr_t;

typedef struct pcaprec_hdr_s {
   uint32_t ts_sec;         /* timestamp seconds */
   uint32_t ts_usec;        /* timestamp microseconds */
   uint32_t incl_len;       /* number of octets of packet saved in file */
   uint32_t orig_len;       /* actual length of packet */
} pcaprec_hdr_t;

typedef struct ethernet_hdr_s {
   uint8_t dst[6];    /* destination host address */
   uint8_t src[6];    /* source host address */
   uint16_t type;     /* IP? ARP? RARP? etc */
} ethernet_hdr_t;

typedef struct ip_hdr_s {
   uint8_t  ip_hl:4, /* both fields are 4 bits */
            ip_v:4;
   uint8_t        ip_tos;
   uint16_t       ip_len;
   uint16_t       ip_id;
   uint16_t       ip_off;
   uint8_t        ip_ttl;
   uint8_t        ip_p;
   uint16_t       ip_sum;
   uint32_t ip_src;
   uint32_t ip_dst;
}ip_hdr_t;

typedef struct udp_header
{
  uint16_t src;
  uint16_t dst;
  uint16_t length;
  uint16_t checksum;
} udp_header_t;
Soyez prudent avec l'ordre des octets -- je pense que les paquets capturés toujours utiliser le réseau d'ordre des octets, mais vous pourriez avoir besoin pour vérifier l'ordre des octets de l'en-tête. Peut-être pas un souci, si le format de fichier utilise le magic_number champ pour déterminer l'ordre des octets de l'en-tête.
Le nombre magique vous permet d'écrire dans les deux big ou little-endian, vous pouvez même basculer après chaque paquet si vous le souhaitez. Le nombre magique vous alerte également pour les dommages causés par un mauvais transfert du fichier.
Le nombre magique n' pas laissez-vous écrire le paquet en big-endian ou little-endian; vous devez écrire cela dans l'ordre dans lequel il apparaît sur le fil, qui, pour l'Ethernet, IP, TCP et UDP multi-octets partie intégrante des champs, est big-endian. t vous permettent d'écrire les champs dans le fichier et l'enregistrement d'en-tête dans votre langue natale, l'ordre des octets, mais vous pourriez tout aussi bien laisser libpcap/WinPcap faire ce travail. Et, malheureusement, le nombre magique n'est pas affecté, par exemple, via ftp le fichier en mode ASCII entre Windows et UN*X.

OriginalL'auteur KaiserJohaan | 2011-09-05