我想解碼一個pcap file及其工作正常,除了幾件事。Haskell中的Pcap文件解碼
import Network.Pcap
import System.IO
import Control.Monad
callfun f = do
(p , q) <- next f
print $ hdrSeconds p
print $ hdrCaptureLength p
print $ hdrWireLength p
print q
when (hdrWireLength p /= 0) $ callfun f
main = do
f <- openOffline "udp_lite_full_coverage_0.pcap"
callfun f
我想hdrSeconds P中的時間返回[時間捕捉到在相同的格式Wireshark的[日期:月:年時:分:秒],並以ASCII format.Kindly可變Q數據告訴回報我如何做到這一點。
其實我試圖解析pcap文件,以與wireshark幾乎類似的方式顯示其內容,而沒有libpcap庫[純粹通過以二進制格式打開pcap文件並逐字節讀取]在haskell中,但我無法得到任何進一步的信息。有些人可以把這個項目的指導地圖放在什麼地方閱讀,如何處理,任何你認爲會有幫助的東西。
編輯: 我開始寫這個應用程序,但有一些東西丟失。我讀這個文件http://www.viste.com/Linux/Server/WireShark/libpcapformat.pdf,它說,前24個字節是全局標題,然後每個數據包包含pcap本地標題。我想要做的是,首先嚐試通過閱讀本地頭部中的第三個 字段incl_len來獲取每個數據包中的數據字節,但是我的代碼不像它假設的那樣工作。我的測試libcap file。
--http://www.viste.com/Linux/Server/WireShark/libpcapformat.pdf
import Data.List
import qualified Data.ByteString.Lazy as BS
import qualified Data.ByteString.Lazy.Char8 as B
import Control.Monad
import Text.Printf
import Data.Word
import Data.Char
import System.Time
import Numeric
import System.Environment
hexTodec :: BS.ByteString -> Integer
hexTodec lst = read $ "0x" ++ ( concatMap (\x -> showHex x "") $ BS.unpack lst )
parseFile :: BS.ByteString -> Bool -> IO [ BS.ByteString ]
parseFile xs revflag
| BS.null xs = return []
| otherwise = do
let ind =if revflag then hexTodec . BS.reverse . BS.take 4 . BS.drop 8 $ xs
else hexTodec . BS.take 4 . BS.drop 8 $ xs
print ind
let (x , ys) = BS.splitAt (fromIntegral ind ) xs
--BS.putStrLn $ x
tmp <- parseFile ys revflag
return $ x : tmp
main = do
[ file ] <- getArgs
contents <- BS.readFile file
let (a , rest) = BS.splitAt 24 contents --strip global header
let revflag = case BS.unpack $ BS.take 4 a of
[ 0xd4 , 0xc3 , 0xb2 , 0xa1 ] -> True
_ -> False
p <- parseFile rest revflag
print $ p !! 0
BS.putStr $ p !! 0
問候
穆克什·蒂瓦里