转载地址:https://blog.csdn.net/angle0615303/article/details/7716151

Uip源代码可以从http://www.sics.se/~adam/uip/index.php/Main_Page上下载得到。

Uip的源码目录结构:

D:.
├─apps
│  ├─dhcpc
│  ├─hello-world
│  ├─resolv
│  ├─smtp
│  ├─telnetd
│  ├─webclient
│  └─webserver
│      └─httpd-fs
├─doc
│  └─html
├─lib
├─sourceinsight
├─uip
└─unix

App目录是一些应用层的协议和实例,Doc目录是文档,lib目录下有内存块管理函数,uip下uip协议栈的源代码,unix下是unix环境里的uip应用例子。

研究unix下的代码可以知道uip是如何使用的,关键是理解uip协议栈的主控制循环。

int main(void)

{

int i;

uip_ipaddr_t ipaddr;

struct timer periodic_timer, arp_timer;

//设置TCP超时处理时间和ARP老化时间

timer_set(&periodic_timer, CLOCK_SECOND / 2);

timer_set(&arp_timer, CLOCK_SECOND * 10);

//驱动初始化

tapdev_init();

//协议栈初始化

uip_init();

//设置IP地址、网关等参数

uip_ipaddr(ipaddr, 192,168,0,2);

uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr, 192,168,0,1);

uip_setdraddr(ipaddr);

uip_ipaddr(ipaddr, 255,255,255,0);

uip_setnetmask(ipaddr);

//应用层初始化

httpd_init();

//主循环

while(1)

{

//从网卡读取数据

uip_len = tapdev_read();

//如果数据存在则按协议处理

if(uip_len > 0)

{

//如果收到的是IP数据,调用uip_input()处理

if(BUF->type == htons(UIP_ETHTYPE_IP))

{

uip_arp_ipin();

uip_input();

/* 处理完成后如果UIP_BUF里有数据,即

uip_len>0,则调用tapdev_send发送出去*/

if(uip_len > 0) {

uip_arp_out();

tapdev_send();

}

}

//如果收到的是ARP数据,调用uip_arp_arpin处理

else if(BUF->type == htons(UIP_ETHTYPE_ARP))

{

uip_arp_arpin();

/* 查看是否有要发送的数据并发送*/

if(uip_len > 0)

{

tapdev_send();

}

}

}

//查看0.5s是否到了,调用uip_periodic处理TCP超时程序

else if(timer_expired(&periodic_timer))

{

timer_reset(&periodic_timer);

for(i = 0; i < UIP_CONNS; i++)

{

uip_periodic(i);

if(uip_len > 0)

{

uip_arp_out();

tapdev_send();

}

}

#if UIP_UDP

//处理udp超时程序

for(i = 0; i < UIP_UDP_CONNS; i++)

{

uip_udp_periodic(i);

if(uip_len > 0)

{

uip_arp_out();

tapdev_send();

}

}

#endif /* UIP_UDP */

/* 10s到了就处理ARP*/

if(timer_expired(&arp_timer))

{

timer_reset(&arp_timer);

uip_arp_timer();

}

}

}

return 0;

}

uip协议栈分析(1)相关推荐

  1. uip协议栈分析(2)

    uip的内存管理方法: 内存管理的实现在memb.c/memb.h里. 这两个文件负责uip的内存块的管理,内存块是由MEMB()宏声明.内存从声明的内存块里用memb_alloc()分配,用memb ...

  2. UIP协议栈移植到u-boot详解

    Author: 杨正  date:2014.11.5  Email:y2012ww@gmail.com QQ: 1209758756 1.uip简介 Uip网络是一个简单好用的嵌入式协议栈,易于移植且 ...

  3. STM32+ENC28J60+UIP协议栈实现WEB服务器示例

    一.环境介绍 MCU:  STM32F103ZET6 网卡: ENC28J60 协议栈: UIP 开发软件: Keil5 二.功能介绍 完整项目源码下载链接:https://download.csdn ...

  4. GD32F4xx uIP协议栈移植记录

    uIP是一个非常小的TCP/IP栈.完全用C编写,可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行. 1.uIP中需要移植的文件 首先在项目中创建一个eth ...

  5. 【uip移植】在AVR单片机ATMega16A上运行uip协议栈,网卡使用ENC28J60

    开发环境:Atmel Studio 7.0 使用的开发板:锐志51单片机开发板+AVR转接座 单片机:40脚直插的ATMega16A Flash容量:16KB SRAM容量:1KB(这个是最紧缺的资源 ...

  6. linux下iptables和netfilter详解(4):洞悉实现流程及协议栈分析

    (一)洞悉linux下的Netfilter&iptables:什么是Netfilter? 很多人在接触iptables之后就会这么一种感觉:我通过iptables命令配下去的每一条规则,到底是 ...

  7. 几种开源的TCP/IP协议栈分析

    1.BSD TCP/IP协议栈 BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的.这是因为BSD栈在BSD许可协 议下提供了这些专业栈的 ...

  8. UIP协议栈笔记·二

    转载地址:http://blog.chinaunix.net/uid-23247944-id-2974928.html 1. 网卡如何与uIP协议交互(包括arp, icmp等)    在我看来,CP ...

  9. Asterisk 1.8 sip 协议栈分析

    引用自:http://blog.csdn.net/z1623866465/archive/2011/01/02/6113057.aspx 看了一下 asterisk 1.8 ,chan_sip 更新了 ...

最新文章

  1. 欧盟中止对中国数据卡产品“两反一保”调查
  2. 20135310陈巧然 20135305姚歌 实验一:开发环境的熟悉
  3. IOS Swift5.5的通知写法
  4. python中单下划线(_)和双下划线(__)的特殊用法 还等什么
  5. 微信第三方平台相关的转发
  6. [转]经典正则表达式
  7. docker+MySQL+读写分离
  8. 【Nginx探究系列二】Nginx配置篇之客户Nginx白名单访问配置
  9. Basic INFO: InstallShield 2012安装过程
  10. 实战:基于Node的控制台记事本开发
  11. b站主页面视频推荐油猴脚本(更新)
  12. Microsoft Visio 专业版 2019
  13. 计算机应用基础搜题答案,大一计算机应用基础试题及答案
  14. Adams 线性多步积分器(一)
  15. Fab-PIE(制程整合工程师)详细介绍
  16. 更好的 java 重试框架 sisyphus 背后的故事
  17. django 常用static\media\邮箱\富文本编辑器配置(备忘)
  18. Photoshop(CC2020)未完
  19. 我爱计算机:张俊林专访
  20. php 类型 打印机,php LPR打印机类

热门文章

  1. Excel插件——LuBan
  2. Angular 图片、条件判断(*ngIf、[ngSwitch]、属性[ngClass]、[ngStyle])
  3. CAN总线显性电平和隐性电平详解
  4. Oracle时间格式化
  5. java 朋友圈分享接口_Java实现微信公众平台朋友圈分享功能详细代码
  6. Windows磁盘管理中的压缩卷操作
  7. select下拉框功能
  8. C/C++的作用域详解
  9. 一个工科生的竹资源探索之旅
  10. unity shader 抖音效果