/********************************************************************
created: 2013/01/15
created: 15:1:2013 18:05
file base: main
file ext: c
author: LeoY
purpose:
*********************************************************************/
#include"pcap_adapter.h"
#include <stdio.h>
#define MAX_CHUNK_NUM 10
// 数据包头+IP头+eth信息+sctp头的长度和 x为IP头结构
#define LENGTH_SCTPALLHEADER(x) x.byteHdLength*4 + sizeof( __EthernetInfo) + sizeof( __SctpHeader)
#define LENGTH_SCTPIPHEADER(x) sizeof( __SctpHeader)
bool main()
{
__pcap_header header;
int iNo = 1;
// 打开源文件和输出文件
if( !OpenPcapFile( "sctp.pcap") || !OpenOutFile( "export.pcap"))
{
return false;
}
// 获得文件头
GetPcapHeader( &header);
//写入文件头
WriteFileHeader( &header);
MoveFirst();
while( !IeEof())
{
__pk_header data;
__ip_header ipData;
__EthernetInfo ethInfo;
Byte* pBuffer;
// 获取下一个数据包
GetPacketAndMoveNext( &data, &pBuffer);
// 获得ETH信息
GetEthernetInfo( ðInfo, pBuffer, 0);
// 获得IP信息
GetIpData( &ipData, pBuffer, sizeof(__EthernetInfo));
// SCTP == 132
if( ipData.byteProtocol == 132)
{
// 获取SCTP头
int iOffset = sizeof( __EthernetInfo) + ipData.byteHdLength * 4;
int iChunkOffset = iOffset + sizeof( __SctpHeader);
__SctpHeader sctpHeader;
__SctpChunk sctpChunkArr[MAX_CHUNK_NUM];
// 当前已保存的chunk数量
int iChunkNum = 0;
// 当前已保存的chunk长度
int iLenght = 0;
// 获得SCTP头
GetSctpHeader( &sctpHeader, pBuffer, iOffset);
while( true)
{
// 当前读取的chunk
__SctpChunk sctpChunk;
// for 循环标志
int i = 0;
GetSctpChunk( &sctpChunk, pBuffer, iChunkOffset);
if( sctpChunk.header.Type == 0) // DATA块 建立新数据包并写入chunk信息
{
WritePkHeader( &data, iLenght + sctpChunk.header.iLength + LENGTH_SCTPALLHEADER(ipData));
WriteEthInfo( ðInfo);
WriteIpHeader( &ipData, iLenght + sctpChunk.header.iLength + LENGTH_SCTPIPHEADER(ipData));
WriteSctpHeader( &sctpHeader);
for( i = 0; i < iChunkNum; i++)
{
WriteSctpChunk( sctpChunkArr + i);
}
WriteSctpChunk( &sctpChunk);
iChunkNum = iLenght = 0;
}
else
{
// 当前块位非DATA块
sctpChunkArr[ iChunkNum++] = sctpChunk;
iLenght += sctpChunk.header.iLength;
}
iChunkOffset += sctpChunk.header.iLength;
if( iChunkOffset >=
ipData.iTotalLength - ((ipData.byteHdLength & 0x0f) * 4))
{
if( iChunkNum > 0)
{
// 存在未写入的chunk数据,全部新建数据包写入
if( sctpChunk.header.Type != 0)
iLenght -= sctpChunk.header.iLength;
WritePkHeader( &data, iLenght + sctpChunk.header.iLength + LENGTH_SCTPALLHEADER(ipData));
WriteEthInfo( ðInfo);
WriteIpHeader( &ipData, iLenght + sctpChunk.header.iLength + LENGTH_SCTPIPHEADER(ipData));
WriteSctpHeader( &sctpHeader);
for( i = 0; i < iChunkNum; i++)
{
WriteSctpChunk( sctpChunkArr + i);
}
}
break;
}
}
}
free( pBuffer);
}
CloseOutFile();
ClosePcapFile();
printf( "Export over");
return true;
}
Pcap Sctp数据拆分
5星 · 超过95%的资源 需积分: 21 169 浏览量
2013-01-15
18:07:00
上传
评论 4
收藏 7KB RAR 举报
yhangleo
- 粉丝: 44
- 资源: 3
最新资源
- multisim1仿真运放及三极管电路应用经典电路multisim10仿真实例源文件合集(21个).zip
- 基于Android的Fragment+ViewPager实现滑屛切换界面应用设计与实现1(源码)
- tensorflow-2.9.3-cp38-cp38-win-amd64.whl
- tensorflow-gpu-2.9.3-cp38-cp38-win-amd64.whl
- 1716994562763661.750000.jpg
- tensorflow-gpu-2.9.2-cp38-cp38-win-amd64.whl
- FSA-火烈鸟搜索优化算法
- 幸运女生眷顾.html
- 送修改教程.zip
- java-选择排序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页