目录
一、前言
文章内容为学习 老衲五老老师的《LwIP Web服务器设计》培训课程中的 环境搭建 章节的学习总结,课程内容包含有每讲的视频录制和程序源码,如想获取可以购买原教程。
二、lwip在windows运行的架构
在LWIP与底层操作系统之间还有一个模拟层sys_arch.c,所以底层操作系统不同时,值需要修改操作系统模拟层即可。
三、环境搭建
1、安装VS2010 破解方法:https://wenku.baidu.com/view/0da247c2aa00b52acfc7ca76.html?re=view
VS工程介绍:https://blog.csdn.net/luoweifu/article/details/48692267
2、安装Winpcap,允许开机自启动
3、安装Wireshark
4、解压工程包
5、配置环境变量,这里配置PCAP_DIR环境变量的目的是为了Lwip_Test工程能找到Wpcap的库
6、打开工程目录为win-lwip\contrib\ports\win32\msvc\lwIP_Test.sln
7、工程代码参数配置,GUID在wireshark中可以查看,IP地址需要跟本机IP在同一个网段,而不是用本机的IP地址。
对于IP地址和MAC 地址设置(看视频)有一个重点,通常情况下我们是使用第二种配置,这样在一台电脑上就可以完成调试。
如果LwIP 使用的网卡地址设置得和我们主机的网卡地址一样,那么LwIP 可以访问外部主机,外部主机也可以访问LwIP,但是本地主机不能访问LwIP,这个是winpcap 的一个限制。
如果LwIP 使用的网卡地址设置得和我们主机的网卡地址不同,那么LwIP 不能访问外部主机,外部主机也不能访问LwIP,但是本地主机可以访问LwIP。
所有应用的开关在lwipcfg_msvc.h 文件中,要测试什么应用,直接把对应的宏定为1 就可以了:
四、lwip在windows上的移植
1、移植关键 --- Winpcap抓包
正常Windows上的TCPIP通讯是左边Application <---> TCPIP <----> 内核。但要在windows上移植使用lwip就不能再使用windows原始的TCPIP协议栈。要借助windows上的抓包原理来实现lwip的移植和使用,那比如在windows上使用wireshark抓包的时候其实依赖的是Winpcap(图圈出来部分),应用程序在从内核接收数据包或应用发送数据包的时候,其实是会拷贝一份调用Winpcap的API进行解析,实现抓包的功能,不会影响左边正常数据包的发送跟接收。
同样借助于Winpcap,将lwip放置在用户态,调用Winpcap的API来实现与windows内核网卡之间数据包的交互,lwip和wpcap.dll动态库作为windows上的一个进程
2、移植内容:三个头文件,三个网卡函数,一个任务,模拟层移植
- 头文件移植:cc.h / perf.h / lwipopts.h
- 网卡驱动
1)pbuf结构,POOL类型,RAM类型
2)libpcap函数,lwip数据包发送接收与Wincap的对接,用Wincap的API函数来实现lwip中的三个网卡函数
pcap_t * pcap_open_live(const char * device, int snaplen, int promisc, int to_ms, char * errbuf)
int pcap_dispatch(pcap_t * p, int cnt, pcap_handler callback, u_char * user)
u_char* pcap_next(pcap_t *, struct pcap_pkthdr *);
int pcap_sendpacket(pcap_t *, const u_char *, int);
void low_level_init(struct netif *netif)
err_t low_level_output(struct netif *netif, struct pbuf *p)
struct pbuf *low_level_input(struct netif *netif)
- 一个任务
1)内核初始化,tcpip_init内核初始化,创建内核处理线程
2)添加网卡管理结构,netif_add 添加一个网卡到内核,由内核管理
3)数据包处理与内核超时处理,内核线程tcpip_thread,负责处理邮箱中的数据包