2011-03-08 17 views
6

libpcap का उपयोग किए बिना मैं एक लॉग फ़ाइल लिखने की कोशिश कर रहा हूं जो पैक फ़ाइल फ़ाइल (format) का पालन करता है। इस फ़ाइल को वायरशर्क द्वारा पठनीय करने की आवश्यकता है। अब तक मैं C++ इस लिखा है:पीसीएपी कैप्चर फ़ाइल हेडर कैसे लिखें?

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(); 

तो यह एक खाली कब्जा फ़ाइल बनाना चाहिए, लेकिन जब मैं Wireshark में इसे खोलने मैं के साथ स्वागत कर रहा हूँ:

फ़ाइल "हैलो प्रतीत होता है कि .pcap "एक पैकेट या अन्य डेटा के बीच में छोटा हो गया है।

मैंने आउटपुट फ़ाइल को बाइनरी मोड में खोलने का प्रयास किया है, लेकिन इससे मदद नहीं मिली। मैं इसे वायरशर्क फोरम में पोस्ट करूंगा, लेकिन मुझे लगता है कि यह उपयोगकर्ता त्रुटि है, वायरशर्क के साथ कुछ गलत नहीं है।

सहायता की बहुत सराहना की जाएगी।

उत्तर

3

<< टेक्स्ट के रूप में स्वरूपित संख्याओं को लिखता है (उदाहरण के लिए, उस संख्या का प्रतिनिधित्व करने वाले चार बाइट्स के बजाय पांच-वर्ण स्ट्रिंग "65535")।

बाइनरी डेटा आउटपुट करने के लिए फ़ाइल को ios::binary के साथ खोलें और write का उपयोग करें। यह बयान संपूर्ण शीर्ष लेख लिखेंगे:

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

endianness पाठक द्वारा पता लगाया जाता है, तो यह जब तक मुझमें struct सदस्यों के बीच कोई पैडिंग के रूप में पोर्टेबल है।

ध्यान दें कि thiszoneint32_t होना चाहिए।

+0

और यदि ओप एक सिस्टम पर है, जहां यह महत्वपूर्ण है, तो 'ios :: बाइनरी' के साथ फ़ाइल को खोलें – nos

+0

@nos - अच्छा बिंदु, धन्यवाद। – aaz

संबंधित मुद्दे