嵌入式TCPIP协议栈
嵌入式 TCP/IP 协议栈
目前,市场上几乎所有的嵌入式TCP/IP协议栈都是根据BSD版的TCP/IP协议栈 改写的。在商业嵌入式 TCP/IP 协议栈大都相当昂贵的情况下,很多人转而使用 一些源代码公开的免//IP 包处理
if(uip_len>0){ //有带外回应数据
uip_arp_out(); //加以太网头结构,在主动连接时可能要构造 ARP 请求
ethernet_devicedriver_send(); //发送数据到以太网(设备驱动程序)
}
}else if(BUF->type==HTONS(UIP_ETHTYPE_ARP)){
//是 ARP 请求包
uip_arp_arpin();//如是是ARP回应,更新ARP表;如果是请求,构造回应数据包
if(uip_len>0){ //是 ARP 请求,要发送回应
ethernet_devicedriver_send(); //发 ARP 回应到以太网上
}
}
另一个需要驱动程序支持的函数是uip_periodie (conn)。这个函数用于uIP内核 对各连接的定时轮循,因此需要一个硬件支持的定时程序周期性地用它轮循各连 接,一般用于检查主机是否有数据要发送,如有,则构造IP包。使用示例如下:
for(i=0;i<UIP_CONNS;i++){
uip_periodic(i);
if(uip_len>0){
uip_arp_out();
ethernet_devicedriver_send();
}
}
从本质上来说,uip_input()和uip_periodic()在内部是一个函数,即uip_process(u8t flag) , UIP 的设计者将 uip_process(UIP_DATA)定义成 uip_input(),而将 uip_process(UIP_TIMER)定义成uip_periodic(),因此从代码实现上来说是完全复用 的。
4 uIP的应用程序接口
为了将用户的应用程序挂接到uIP中,必须将宏UIP_APPCALL ()定义成实际的 应用程序函数名,这样每当某个uIP事件发生时,内核就会调用该应用程序进行 处理。如果要加入应用程序状态的话,必须将宏UIP_APPSTATE_SIZE定义成应用 程序状态结构体的长度。在应用程序函数中,依靠uIP事
件检测函数来决定处理的方法,另外可以通过判断当前
连接的端口号来区分处理不同的连接。下面的示例程序是笔者实现的一个 Web 服务器应用的框架。
#define UIP_APPCALL uip51_appcall
#define UIP_APPSTATE_SIZE sizeof(struct uip51app_state)
struct uip51app_state{
unsigned char * dataptr;
unsigned int dataleft;
};
void uip51_initapp{ //设置主机地址 u16_t ipaddr[2];
uip_ipaddr(ipaddr,202,120,127,192);
uip_sethostaddr(ipaddr);
uip_l
嵌入式TCPIP协议栈 来自淘豆网m.daumloan.com转载请标明出处.