关于TCP/UDP的包过滤函数
来源:互联网 发布:kevin macleod 知乎 编辑:程序博客网 时间:2024/05/21 17:48
//包过滤函数
FORWARD_ACTION FilterPacket(
unsignedchar *PacketHeader,
unsignedchar *Packet,
unsignedint PacketLength,
DIRECTION_E direction,
unsignedint RecvInterfaceIndex,
unsignedint SendInterfaceIndex)
{
//提取IP头
IPheader *pIPHdr=(IPHeader *) PacketHeader;
TCPHeader *pTCPHdr=NULL:
UDPHeader *PUDPHdr=NULL:
if(PIPHdr->ipProtocol==6) //是TCP协议
{
pTCPHdr=(TCPHeader*)Packet; //提取TCP头
if(!(pTCPHdr->falgs&0x02))
{
return FORWARD;
}
}
//与过滤规则相比较,决定采取的行动
CFilterList *pList=g_pHeader;
while(pList!=NULL)
{
//比较协议
if(pList->ipf.protocol==0||pList->ipf.protocol==pIPhdr->ipProtocol)
{
//查看源IP地址
if(pList->ipf.sourceIP!=0&(pList->ipf.sourceIP&pList->ipf.sourceMask)!=pIPHdr->ipSource)
{
pList=pList->pNext;
continue;
}
//查看目的IP地址
if(pList->ipf.destinationIP!=0&(pList->ipf.destinationIP&pList->ipf.destinationMask)!=pIPHdr->ipDestination)
{
pList=pList->pNext;
continue;
}
}
//如果为TCP封包,查看端口号
if(pIPHdr->ipProtocol==6)
{
pTCPHdr=(TCPHeader*)Packet;
if(pList->ipf.sourcePort==0||pList->ipf.sourcePort==pTCPHdr->sourcePort)
{
if(pList->ipf.destinationPort==0||pList->ipf.destinationPort==pTCPHdr->destinationPort)
{
if(pList->ipf.bDrop)
return DROP;
else
return FORWARD;
}
}
}
//如果是UDP封包,查看端口号
else if(pIPHdr->ipProtocol==17)
{
pUDPHdr=(UDPHeader*)Packet;
if(pList->ipf.sourcePort==0||pList->ipf.sourcePort==pUDPHdr->sourcePort)
{
if(pList->ipf.destinationPort==0||pList->ipf.destinationPort==pUDPHdr->destinationPort)
{
if(pList->ipf.bDrop)
return DROP;
else
return FORWARD;
}
}
}
//其他封包直接处理
else
{
if(pList->ipf.bDrop)
return DROP;
else
return FORWARD;
}
}
//比较下一规则
pList=pList->pNext;
}
return FORWARD;
}
- 关于TCP/UDP的包过滤函数
- 关于TCP和和UDP包的大小
- 关于TCP和和UDP包的大小
- 关于TCP/UDP的输出
- TCP\UDP常见的函数
- TCP 、UDP包的最大长度是多少?
- TCP/UDP包格式
- [TCP/IP] TCP与UDP不同的包处理方式
- tcp udp 的粘包 断包分析
- 关于linux的tcp/udp缓存
- 关于linux的tcp/udp缓存
- 关于TCP和UDP的异同点
- 关于TCP和UDP的端口介绍
- 关于数据包的伪装,UDP,TCP
- 关于tcp和udp的缓冲区
- 关于socket通信UDP,TCP的理解
- 关于udp和tcp的一些比较
- 关于UDP和TCP通讯的介绍
- 工作中遇到的shell脚本知识(3)
- UIWebView使用js 修改样式
- 尽量使用strncpy,snprintf,少用strcpy,sprintf
- JTabbedPane快捷切换
- js跳转页面常用方法总结
- 关于TCP/UDP的包过滤函数
- 五大常用算法之四:回溯法
- HDU 1059 POJ 1014 Dividing (多重背包)
- UM九图
- Maven settings细节
- jave获取视频时长(视频信息)
- Spring mvc 入门
- 黑马程序员 JAVA基础--多线程(二)
- 经典过桥问题证明