多年不做程序员,近日来由于工作偶有需要,在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 /* 错误缓冲池 */