我想用libpcap解码zst和gz pcap,但我找不到任何这样做的例子。当然,我不希望有一个临时解压缩的pcap文件。你们能告诉我正确的方法吗?
感谢在linux上,您可以使用libz打开gzip文件,并使用fopencookie()将读/写/查找/关闭函数重新映射为libz的等效函数。
//-------------------------------------------------------------------------
ssize_t gzip_cookie_read( void * cookie, char * buf, std::size_t size )
{ return ::gzread( reinterpret_cast<gzFile>(cookie)
, buf
, size
) ;
}
ssize_t gzip_cookie_write( void * cookie, const char * buf, std::size_t size )
{ return ::gzwrite( reinterpret_cast<gzFile>(cookie)
, buf
, size
) ;
}
int32_t gzip_cookie_seek( void * cookie, off64_t * off, int32_t whence )
{
z_off_t rv = ::gzseek( reinterpret_cast<gzFile>(cookie)
, *off
, whence
) ;
if( rv >= 0 )
{ *off = rv ;
return 0 ;
}
return -1 ;
}
int32_t gzip_cookie_close( void * cookie )
{ return ::gzclose( reinterpret_cast<gzFile>(cookie) ) ;
}
//------------------------------------------------------------------
//
cookie_io_functions_t
gzip_cookie_functions =
{ .read = gzip_cookie_read
, .write = gzip_cookie_write
, .seek = gzip_cookie_seek
, .close = gzip_cookie_close
} ;
... Then
char err_buf[ PCAP_ERRBUF_SIZE + 1] ;
std::memset( err_buf, 0, sizeof(err_buf) ) ;
gzFile gzf = ::gzopen( args[1].c_str(), "r" ) ;
if( gzf == Z_NULL )
{ std::cout
<< "Error: Failed to open input file (via gzopen())" << std::endl
<< "(" << err_buf << ")" << std::endl
<< std::endl ;
return EXIT_FAILURE;
}
// Convert gzFile handle to FILE pointer w/ same underlying stream.
FILE * pcfp = ::fopencookie( gzf, "r", gzip_cookie_functions ) ;
if( pcfp == nullptr )
{ std::cout
<< "Error: Failed to redirect file i/o functions through zlib via funopen()" << std::endl
<< "(" << err_buf << ")" << std::endl
<< std::endl ;
return EXIT_FAILURE;
}
::pcap_t * pch = ::pcap_fopen_offline_with_tstamp_precision
( pcfp
, PCAP_TSTAMP_PRECISION_NANO
, err_buf
) ;
if( pch == nullptr )
{ std::cout
<< "Error: Failed to open input file" << std::endl
<< "(" << err_buf << ")" << std::endl
<< std::endl ;
return EXIT_FAILURE;
}
Libpcap目前不支持读取压缩文件。
如果你不想有一个临时的解压pcap文件,这样做的唯一方法就是让你的程序创建一个管道,运行另一个程序读取压缩文件解压文件和写数据到标准输出,标准输出被写的烟斗,从读标准I/O流的管道(使用,例如,在类unix系统上fdopen()
),然后使用pcap_fopen_offline()
开放标准I/O流捕获文件。
这样,另一个程序将执行解压缩,但是将其写入管道而不是文件,并且您的程序将从管道读取解压缩的数据。