uIP协议栈初步认识
2015-06-16 16:16
459 查看
Uip源代码可以从http://www.sics.se/~adam/uip/index.php/Main_Page下载得到。
Uip的源码目录结构:
├─apps
│ ├─dhcpc
│ ├─hello-world
│ ├─resolv
│ ├─smtp
│ ├─telnetd
│ ├─webclient
│ ├─webserver
│ │ ├─httpd-fs
│ ├─doc
│ │ ├─html
│ ├─lib
│ ├─uip
│ ├─unix
apps目录是一些应用层的协议和实例,doc目录是文档,lib目录下有内存块管理函数,uip下uip协议栈的源代码,unix下是unix环境里的uip应用例子。
研究unix目录下的例子可以知道uip是如何使用的,关键是理解uip协议栈的主控制循环。
转载http://blog.csdn.net/zorrosopc/article/details/4425170
Uip的源码目录结构:
├─apps
│ ├─dhcpc
│ ├─hello-world
│ ├─resolv
│ ├─smtp
│ ├─telnetd
│ ├─webclient
│ ├─webserver
│ │ ├─httpd-fs
│ ├─doc
│ │ ├─html
│ ├─lib
│ ├─uip
│ ├─unix
apps目录是一些应用层的协议和实例,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; }
转载http://blog.csdn.net/zorrosopc/article/details/4425170
相关文章推荐
- POJ 3368 Frequent values(线段树)
- SQL Server error "Xml data type is not supported in distributed queries" and workaround for it
- 利用Associative机制为UIAlertView添加一个Block属性,将AlertView与button的响应事件关联
- DOM对像直接转为jq 方法用; 比如value 是一个dom 对像, 转为jq方法是
- ABAP--SAP是如何回写CL_GUI_ALV_GRID_BASE的MT_MODIFIED_CELLS的
- java生成UUID通用唯一识别码 (Universally Unique Identifier)
- android bluedroid调试
- Android Volley完全解析(三),定制自己的Request
- Collection、List、Set、Map、Queue关系图学习笔记2
- mysql慢查询分析工具 pt-query-digest
- iOS学习之UIDatePicker控件使用
- 实时显示iOS编写UI代码效果:有效提高UI编写速度
- iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button
- UIViewController的基本概念与生命周期
- bluetooth 术语
- Implement Stack using Queues
- UVA 1152 4 Values whose Sum is 0 (hash)
- IBM Bluemix 问题-MySQL
- UILabel中插入图片
- Java GUI程序设计的初步上