lwip在windows运行环境搭建

目录

一、前言

二、lwip在windows运行的架构

三、环境搭建

四、lwip在windows上的移植


一、前言

文章内容为学习 老衲五老老师的《LwIP Web服务器设计》培训课程中的 环境搭建 章节的学习总结,课程内容包含有每讲的视频录制和程序源码,如想获取可以购买原教程。

二、lwip在windows运行的架构

在LWIP与底层操作系统之间还有一个模拟层sys_arch.c,所以底层操作系统不同时,值需要修改操作系统模拟层即可。

lwip在windows运行环境搭建_第1张图片

三、环境搭建

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、解压工程包

lwip在windows运行环境搭建_第2张图片

5、配置环境变量,这里配置PCAP_DIR环境变量的目的是为了Lwip_Test工程能找到Wpcap的库

lwip在windows运行环境搭建_第3张图片

 

lwip在windows运行环境搭建_第4张图片

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运行环境搭建_第5张图片

 

lwip在windows运行环境搭建_第6张图片

 

四、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上的一个进程

 

lwip在windows运行环境搭建_第7张图片

 

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,负责处理邮箱中的数据包

你可能感兴趣的:(网络编程)