如何从旁路控制一个网络流量具体实现?
szclm 2004-03-22 04:04:26 之前我问过这个问题:
http://expert.csdn.net/Expert/topic/2817/2817741.xml?temp=.8323328
经大家的推荐实现了tcmp源站抑制差错type = 4, code = 0的流量控制程序,
自己构造tcmp包,根据要限制的IP地址构造的,具体程序如下:
//使用winpcap库
//uIpData 是网络上的原始数据包
void CTestICMPDlg::MakeICMP( UCHAR *uIpData )
{
//构建一个区域,来保存icmp包
UCHAR uTmpIcmp[2048] = "";
memset( uTmpIcmp, 0 , 2048 );
Packet *src_p = new Packet, *dst_p = new Packet;
dst_p->pkt = uTmpIcmp;
src_p->pkt = uIpData;
dst_p->eh = (EtherHdr*)uTmpIcmp;
src_p->eh=(EtherHdr*)uIpData;
//处理链路层数据
memcpy( dst_p->eh->ether_dst, src_p->eh->ether_src, 6 ); //将mac目->源
memcpy( dst_p->eh->ether_src, src_p->eh->ether_dst, 6 ); //将mac源->目
dst_p->eh->ether_type = src_p->eh->ether_type;
//处理IP包数据
if( src_p->eh->ether_type== ETHERNET_TYPE_IP)
{
src_p->iph=(IPHdr*)(src_p->pkt+ETHERNET_HEADER_LEN);
dst_p->iph=(IPHdr*)(dst_p->pkt+ETHERNET_HEADER_LEN);
//只对tcp和udp包抑制
if( src_p->iph->ip_proto == IPPROTO_TYPE_TCP ||
src_p->iph->ip_proto == IPPROTO_TYPE_UDP )
{
//复制ip信息
dst_p->iph->ip_dst = src_p->iph->ip_src;
dst_p->iph->ip_src = src_p->iph->ip_dst;
dst_p->iph->ip_ver = src_p->iph->ip_ver;
dst_p->iph->ip_hlen = 5;
dst_p->iph->ip_tos = 0;
dst_p->iph->ip_len = 0x3800;
dst_p->iph->ip_id = 0x5144;
dst_p->iph->ip_csum = 0;
dst_p->iph->ip_proto = 1;
dst_p->iph->ip_ttl = 128;
dst_p->iph->ip_csum = checksum( (USHORT *)(dst_p->pkt+ETHERNET_HEADER_LEN), 20 );//效验
//设置ICMP信息
dst_p->icmph=(ICMPHdr*)(dst_p->pkt+ETHERNET_HEADER_LEN+dst_p->iph->ip_hlen*4);
dst_p->icmph->code = 0;
dst_p->icmph->type = 4;
dst_p->icmph->csum = 0;
//拷贝原始包的ip首部和数据的前8个字节
memcpy( dst_p->pkt+ETHERNET_HEADER_LEN+dst_p->iph->ip_hlen*4 + 8, src_p->pkt+ETHERNET_HEADER_LEN, 32 );
//计算效验和
dst_p->icmph->csum = checksum( (USHORT *)(dst_p->pkt+ETHERNET_HEADER_LEN), 56 );
//发送这个包
pcap_sendpacket( fp, uTmpIcmp, 70 );
}
}
if( src_p != NULL )
delete src_p;
if( dst_p != NULL )
delete dst_p;
}
现在发现这个方法达不到效果!
请问大家还有其它的方法吗?或是我的运用上有问题呢?