2011-03-08 3 views
6

libpcap을 사용하지 않고 pcap 파일 형식 (format)을 준수하는 로그 파일을 작성하려고합니다. 이 파일은 WireShark에서 읽을 수 있어야합니다.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(); 

그래서이 빈 캡처 파일을 확인해야합니다,하지만 난 와이어 샤크에서 열 때 나는 맞이하고있다 : 지금까지 나는 C++이 서면으로 작성했습니다 안녕하세요 "

파일 .pcap "은 패킷이나 다른 데이터의 중간에 짧게 잘라낸 것처럼 보입니다.

출력 파일을 이진 모드로 열려고 시도했지만 도움이되지 않았습니다. WireShark 포럼에 게시 할 것이지만, 이것이 WireShark의 잘못된 점이 아니라 사용자 오류라고 생각합니다.

도움을 많이 주시면 감사하겠습니다.

답변

3

<<은 텍스트 형식의 숫자 (예 : 해당 숫자를 나타내는 4 바이트 대신 5 문자 문자열 "65535")를 씁니다.

이진 데이터를 출력하려면 ios::binary으로 파일을 열고 write을 사용하십시오. 이 문은 전체 헤더를 작성합니다 : 엔디안은 독자에 의해 감지

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

를, 그래서 이것은 한 구조체 구성원 간의 패딩이 없습니다와 같은 휴대용입니다.

thiszoneint32_t이어야합니다.

+0

op가 문제가되는 시스템에있는 경우, 'ios :: binary'로 파일을 엽니 다. – nos

+0

@nos - 좋은 지적입니다. 감사합니다. – aaz

관련 문제