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);
//應用層初始化
//主迴圈
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協議棧分析
uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...
uip協議棧分析(2)
uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...
uip協議棧分析(2)
uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...