winpcap小窥-tcp包截取与转发

多年不做程序员,近日来由于工作偶有需要,在32位系统上做了利用winpcap做了一个包转发器。主要完成的功能是:需要从某一台电脑截取其发向某服务器,某端口的包,然后转发到目的服务器对应端口。在参考了winpcap的样例代码后,发现其只有分析UDP包的样例程序,于是乎自己做了一个TCP包的截获解析并转发。下面上干货。这一段,都是winpcap的相关代码:int main(int argc ,
摘要由CSDN通过智能技术生成

多年不做程序员,近日来由于工作偶有需要,在32位系统上做了利用winpcap做了一个包转发器。主要完成的功能是:需要从某一台电脑截取其发向某服务器,某端口的包,然后转发到目的服务器对应端口。在参考了winpcap的样例代码后,发现其只有分析UDP包的样例程序,于是乎自己做了一个TCP包的截获解析并转发。下面上干货。

这一段,都是winpcap的相关代码:

int main(int argc ,char** argv)  
{  
pcap_if_t *alldevs;  
pcap_if_t *d;  
int inum;  
int i=0;  
pcap_t *adhandle;  
char errbuf[PCAP_ERRBUF_SIZE];  
FILE* pf;
u_int netmask;
char packet_filter[] = "ip and tcp";
struct bpf_program fcode;
    serv_conf ServConfAll;


    /* 获取本机设备列表 */  
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)  
    {  
        fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);  
        exit(1);  
    }  
      
    /* 打印列表 */  
    for(d=alldevs; d; d=d->next)  
    {  
        printf("%d. %s", ++i, d->name);  
        if (d->description)  
            printf(" (%s)\n", d->description);  
        else  
            printf(" (No description available)\n");  
    }  
      
    if(i==0)  
    {  
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");  
        return -1;  
    }  
    /* 跳转到物理适配器 */ 
printf("Enter the interface number (1-%d):",i);    
scanf("%d", &inum);                                
                                                   
if(inum < 1 || inum > i)                           
{                                                  
printf("/nInterface number out of range./n");  
/* 释放设备列表 */                             
pcap_freealldevs(alldevs);                     
return -1;                                     
}                                                  
                                                   
/* 跳转到已选设备 */                               
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);    


    /* 打开设备 */  
    if ( (adhandle= pcap_open(d->name,          /*  设备名  */ 
                              65536,            /*  65535保证能捕获到不同数据链路层上的每个数据包的全部内容  */
                              PCAP_OPENFLAG_PROMISCUOUS,    /* 混杂模式 */ 
                              1000,             /* 读取超时时间  */
                              NULL,             /*  远程机器验证 */ 
                              errbuf            /* 错误缓冲池 */  
                         

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值