2011-03-08 18 views
6

Sin usar libpcap Estoy intentando escribir un archivo de registro que se adhiera al formato de archivo pcap (format). Este archivo debe ser legible por WireShark. Hasta ahora he escrito esto en C++:¿Cómo escribir el encabezado del archivo de captura PCAP?

struct pcapFileHeader { 
    uint32_t magic_number; /* magic number */ 
    uint16_t version_major; /* major version number */ 
    uint16_t version_minor; /* minor version number */ 
    int16_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 */ 
}; 

ofstream fileout; 
fileout.open("file.pcap", ios::trunc); 

pcapFileHeader fileHeader; 
fileHeader.magic_number = 0xa1b2c3d4; 
fileHeader.version_major = 2; 
fileHeader.version_minor = 4; 
fileHeader.thiszone = 0; 
fileHeader.sigfigs = 0; 
fileHeader.snaplen = 65535; //(2^16) 
fileHeader.network = 1;  //Ethernet 

fileout << fileHeader.magic_number << 
      fileHeader.version_major << 
      fileHeader.version_minor << 
      fileHeader.thiszone << 
      fileHeader.sigfigs << 
      fileHeader.snaplen << 
      fileHeader.network; 

fileout.close(); 

Así que este debe hacer un archivo de captura en blanco, pero cuando lo abro en Wireshark me da la bienvenida con:

El archivo "hola .pcap "parece haberse cortado en el medio de un paquete u otros datos.

He intentado abrir el archivo de salida en modo binario pero eso no ayudó. Lo publicaría en el foro de WireShark, pero creo que es un error del usuario, no algo malo con WireShark.

Ayuda sería muy apreciada.

Respuesta

3

<< escribe los números formateados como texto (por ejemplo, la cadena de cinco caracteres "65535" en lugar de cuatro bytes que representan ese número).

Para enviar datos binarios abra el archivo con ios::binary y use write. Esta declaración será escribir toda la cabecera:

fileout.write(reinterpret_cast<const char*>(&fileHeader), 
       sizeof fileHeader); 

El orden de bits es detectado por el lector, por lo que este es portátil, siempre y cuando no hay relleno entre los miembros de la estructura.

Tenga en cuenta que thiszone debe ser int32_t.

+0

Y en caso de que el operador esté en un sistema donde sea importante, abra el archivo con 'ios :: binary' también – nos

+0

@nos - Buen punto, gracias. – aaz

Cuestiones relacionadas