void main(void) //主程序开始 { …… //省略部分代码 timer0_init(); //定时器初始化函数由开发者完成 serial_init(); //串口初始化函数由开发者完成 init_8019(); //网卡芯片初始化函数由开发者完成 uip_init(); //uIP协议栈初始化函数由uIP协议栈提供 httpd_init(); //HTTP应用程序初始化函数由WEB SERVER示例程序提供 uip_arp_init();//ARP协议初始化函数由ARP模块提供 while(1) { uip_len = eth_rcve(); //查询网卡是否有数据到来 if(uip_len == 0) //如果没有数据到来则处理定时事件 { if(0.5秒定时时间到) { for(i = 0; i < UIP_CONNS; i++) // UIP_CONNS为TCP连接数 { uip_periodic(i); //处理每一个TCP连接 if(uip_len > 0) //说明本连接有数据要发送或重发 { uip_arp_out(); //由ARP处理部分添加以太网帧头 eth_send(); //由网卡驱动程序发送 } }//对应于:for() }// 对应于:if(0.5秒定时时间到) if(ARP表项更新时间到) uip_arp_timer(); //进行ARP表项更新 }else if(uip_len > 0) //说明接收到新的数据包 { if(BUF->type == htons(UIP_ETHTYPE_IP))//如果收到IP数据包 { uip_arp_ipin(); //送ARP模块进行表项更新 uip_len -= sizeof(struct uip_eth_hdr); //去除以太网帧头 uip_input(); //送uip_input()进行处理 if(uip_len > 0) //若uip_input()返回后uip_len不为零说明有数据要回送 { uip_arp_out(); //由ARP部分添加以太网帧头 eth_send(); //送交网卡驱动发送 }//对应于:if()收到IP数据包 }else if(BUF->type == htons(UIP_ETHTYPE_ARP))//如果收到ARP包 { uip_arp_arpin(); //由uip_arp_arpin()处理,如果为应答包则进行表项 //更新 //如果为请求包,则构造应答数据包 if(uip_len > 0) //说明收到的是ARP请求包,需要回送ARP应答包 eth_send(); //送网卡驱动发送 }//对应于:else if()收到ARP数据包 }//对应于:else if() 说明接收到新的数据包 }} 以上实例在keilC51编译器下设置大模式,优化等级6(速度优先)进行编译,对uIP代码部分可以不做任何修改,对HTTP示例代码仅需针对类型表达进行极少量的修改即可编译通过。在硬件平台上运行良好。
五总结
uIP协议栈采用有效的方法和结构化的代码,使其存储器占用量很小并且可以很方便的应用到不同的 工程项目中。同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案,具有很高的应用价值。
参考文献
[1]DOUGLASE.COMER著,用TCP/IP进行网际互连(卷一、卷二)电子工业出版社,2000
[2]JEREMYBENTHAM著,嵌入式系统Web服务器——TCP/IPLean机械工业出版社,2003
[3]uIP协议栈网络站点 http://dunkels.com/adam/uip/
[4]REALTEK公司.RTL8019ASDatasheet,2000
|