投稿    登录
  博主录制的Python3爬虫视频教程已发布!详情请戳Python3爬虫视频教程!希望大家支持!非常感谢!

Winpcap网络编程六之两台主机通过中间主机通信

C/C++ 崔庆才 1969浏览 0评论

本节任务

本次我们需要完成的任务是

完成两台主机通过中间主机的数据通信(网络层)

  •  增加基于IP地址的转发功能
  •  增加网络层封装

其实最主要的就是基于IP地址的转发功能,网络层的封装其实我们在初级功能中就已经做好了。

原理

首先,实验的思路是A通过中间主机B向C发送数据。那么B则作为一个路由器,B要监听两个网卡,一个网卡发来的数据通过另一个网卡发出去。

示意图如下:

A———>B1===B2————>C

从图上可以看出,B主机的两个网卡数据互通,A和B1则处于一个局域网内,B2和C处于另一个局域网内。

就比如这样,现在室友A在用有线上网,我的电脑B也在用有线上网,我们的有线处在同一局域网,我的电脑B同时散着一个无线网,我的手机C又连接到了这个无线上。

那么要实现A到C的数据传送,即模拟室友A要发送数据到我的手机C,那么流程则是这样的:

室友A在有线局域网发送数据到我的网卡B1,B1将数据通过网卡B2转发到无线局域网,通过无线局域网到达我的手机C。

A的发送要构建一个帧,目的MAC地址为B1,目的IP为C。B则要开启两个网卡,B1监听接收数据,B2网卡则要用ARP协议扫描所在无线局域网内的IP和MAC,B获取到了A发来的帧之后,解析它的IP地址和MAC地址,匹配刚才扫描得到的IP和MAC对应表,将源MAC换成B2网卡MAC,目的MAC换成C的MAC,IP不变,数据data不变。构建新帧之后发送出去。

好啦,思路大体就是这样。

实战

需要三个程序,一个是发送,一个路由,一个接收。所以一共三个程序要同时运行起来执行。

以上是我的大体思路,如有错误,还请指正。现已用代码实现完毕。

代码暂不公开,只提供部分重点代码解析:

一、发送端

其实发送端和初级功能的发送差不多

个人编写的交互流程如下:

具体代码不再解析,同上一篇初级功能。

二、路由端

首先要开启两个网卡,声明两个网卡对象和处理器

一个用来接收一个用来发送,这里定义了adhandle是用来发送,adhandle2是用来接收数据。

那么打开适配器就在main方法中,提前打开两个网卡

接下来用用于发送的handle处理器来扫描它的局域网IP,获得局域网内的MAC地址,记录在一个表中,存放IP和MAC的对应关系。

这个表可以用结构体数组来保存,比如可以这样:

那么以上便是准备工作,我们完成了两个网卡的打开,发送网卡扫描获取局域网MAC,接下来便是最重要的监听加转发。

那么这个怎办?那就开一个新线程。

让我们声明一个新的路由线程。

那么线程要接收进来什么参数呢?

首先必须要的是两个网卡处理器,在main方法中已经做好初始化的adhandle和adhandle2,另外还有alldevs,可以持有这个指针来释放设备列表,出现错误时释放资源并退出。

初级功能中声明过了

struct sparam sp;
struct gparam gp;

这两个就是发送ARP线程和接收ARP线程中的两个参数,那么仿照这个功能,我们定义一个新的结构体

在main方法中把它来初始化赋值

当做参数传入这个线程

其中第四个参数就是传递了这个结构体进去。注意这个语句最好不要直接放在main方法中直接调用,可以在全部获取完MAC地址之后再开启这个线程。

那么接下来就说一下这个线程都干了些什么,只简略说一下核心部分。

首先开启了这个线程之后会一直都在执行,那么就可以加入

这样的while判断语句来一直监听数据包的接收,然后解析数据。

然后接下来每接收到一个数据,就进行构建新的帧转发出去,目的MAC先匹配list表,如果list没有找到,那么我让他指定了一个mac,比如广播MAC。源MAC地址则赋值网卡的MAC地址。
注意,传统以太网中数据长度为45-1500,那么我在构建前把解析出的data作了下判断长度再构建,因为我已经把sendbuffer声明为一个固定长度了,为了防止越界,我先进行一个长度判断。

以上只是赋值了帧头,至于IP头,TCP头,数据的赋值就参照初级功能的来赋值吧,不要忘了校验和的检验。好,大体上就是这样,接受来数据包并转发出去的原理就是这样。

三、接收

不用多改,就是初级功能中的接收,在此写一写小小的优化措施,防止接收到过多的数据帧而造成不断乱蹦,导致你看不到接收的东西。

在打印的时候加一个过滤就好了。部分代码如下:

在main方法中提示用户输入要接收的IP地址

打印时的判断

好,代码就先放送这么多,具体的实现只要有了思路我相信肯定不难,如有问题,欢迎与我交流。

转载请注明:静觅 » Winpcap网络编程六之两台主机通过中间主机通信

喜欢 (4)or分享 (0)

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

想结交更多的朋友吗?

来进击的Coder瞧瞧吧

进击的Coder

QQ群号 99350970 立即加入

进击的Coder灌水太多?

这里是纯粹的技术领地

激进的Coder

QQ群号 627725766 立即加入

想找人聊天解闷?想要学习干货?

微信公众号进击的Coder为你打造

进击的Coder

微信公众号 扫一扫关注