title: C - Writing structs to a file (.pcap)
body: <p>I am trying to write a .pcap file, which is something that can be used in Wireshark.
  In order to do that, I have a couple of structs with various data types I need to write to a file. (see code)</p>
  
  <p>So, I create the struct instances, fill in the data, use FILE* fp = fopen("test.pcap","w"), and then I'm unsure how to properly write it to the file. I believe I should use memcpy but I'm not sure of the best way to do it. I have mostly resorted to C++ libraries in the past to do this. Any suggestions?</p>
  
  <pre><code>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;
  </code></pre>