请教大家winpcap发包的问题
我现在想实现的是,接受网络里面所有的请求,并给于每个请求返回三个unreach,两个rst。目的是中断请求。raw socket的实现见http://www.csdn.net/expert/topic/866/866712.xml?temp=.2748529
我现在基本上是把它改成相应winpcap发包的代码。具体如下:
void WINAPI SendICMPPackage(unsigned int icmpcode,LPPACKET lpPacket,void* lpAdapter)
{
LPADAPTER pAdapter = (LPADAPTER) lpAdapter;
//得到一份请求的报文,我们从源报文得到源端口,目的端口,源IP地址,目的IP地址,TCP序列号(重要!)
if (lpPacket->ulBytesReceived> (sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER)))
{
char *pChar;
struct bpf_hdr *hdr;
char *buf=(char*)lpPacket->Buffer;
UINT off=0;
hdr=(struct bpf_hdr *)(buf+off);
off+=hdr->bh_hdrlen;
pChar =(char*)(buf+off); // pChar中指向的才是报文数据。
//////////////////////////////////////////////////////
// ETHER_PACKET *pEthPkt = (ETHER_PACKET *) lpPacket->Buffer;
ETH_HEADER *pEthHdr = (ETH_HEADER *) pChar;
IP_HEADER *pIpHdr = (IP_HEADER *) (pChar+sizeof(ETH_HEADER));
int i_IPH_Size = 20;//pIpHdr->ihl * 4;
TCP_HEADER *pTcpHdr = (TCP_HEADER *) ((char *) pIpHdr + i_IPH_Size);
int i_TCPH_Size = 20;//pTcpHdr->doff * 4;
///////////////////////////////构造一条回应报文//////////
char szSendBuf[100]={0};
struct PPACK
{
ETH_HEADER eth;
IP_HEADER ip;
ICMP_HEADER icmp;
}ppack;
memset(&ppack,0,sizeof(PPACK));
memcpy(ppack.eth.h_dest,pEthHdr->h_source,sizeof(pEthHdr->h_source));
memcpy(ppack.eth.h_source,pEthHdr->h_dest,sizeof(pEthHdr->h_dest));
ppack.eth.h_proto=pEthHdr->h_proto;
ppack.ip.check=0;
ppack.ip.daddr=pIpHdr->saddr;
ppack.ip.frag_off=0;
ppack.ip.h_lenver=pIpHdr->h_lenver;
ppack.ip.id=0;
ppack.ip.protocol=IPPROTO_ICMP;
ppack.ip.saddr=pIpHdr->daddr;
ppack.ip.tos=0;
ppack.ip.tot_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER));
ppack.ip.ttl=64;
ppack.icmp.i_type=3;
ppack.icmp.i_code=icmpcode;
ppack.icmp.i_cksum=0;
memcpy(szSendBuf, &ppack, sizeof(ppack));
//使用winpcap库函数发送包
LPPACKET pPacket;
if((pPacket = PacketAllocatePacket())==NULL)
{
AfxMessageBox("\nError:failed to allocate the LPPACKET structure.");
return ;
}
memset(pPacket,0,sizeof(LPPACKET));
PacketInitPacket(pPacket,szSendBuf,sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+sizeof(ETH_HEADER));
// capture the packet
if(PacketSetNumWrites(pAdapter,5)==FALSE)
{
AfxMessageBox("warning: Unable to send more than one packet in a single write!\n");
}
if(PacketSendPacket(pAdapter,pPacket,TRUE)==FALSE)
{
AfxMessageBox("Error sending the packets!\n");
return ;
}
}
}
发送RST的代码见下面的回复。我的问题是:
我用sniffer抓包发现包已经发出,但连接并没有被中断。是否校验和或者某个参数出现了问题。