uip架构和局限
怎么了解uip
可以看看uip.h。里面有使用函數的說明和例程。
uip_polling在main-while 中調用
check(uip_len>0 ) 有網絡數據后,處理事件。uip_polling定義了這些功能,uip才會有相應的功能。
處理哪些事件。如
UDP用戶代碼
初始化 void udp_app_init(void) {uip_ipaddr_t addr;struct uip_udp_conn *c;uip_ipaddr(&addr, 192,168,0,132);c = uip_udp_new(&addr, HTONS(UDP_TEST_PORT)); //remote portif(c != NULL) {uip_udp_bind(c, HTONS(UDP_TEST_PORT)); //local port} }------------------------------------------------------------------------------------ void udp_appcall(void) { switch(uip_udp_conn->lport){case HTONS(UDP_TEST_PORT):udp_test_app(uip_appdata); break;default: break;} }BB幾句
uip里有很多全局變量,用起來有點頭大。有時根本不知道他用來干嘛的,幾個差不多的變量經常搞混
例如:1網口的接口代碼,也是用的uip_len和uip_buf這種全局變量void tapdev_send(void){ENC28J60_Packet_Send(uip_len,uip_buf);}2 檢查網絡事件if(uip_len>0)代碼風格也不怎么好
uip_process里還很多gotoif(flag == UIP_UDP_SEND_CONN) {goto udp_send;}UDP使用限制
只能單工模式:發送和接收數據共用一個buff,在接收函數里甚至不能回送接收信息
官方例程unix節選 unsigned int tapdev_read(void) {int ret; ret = read(fd, uip_buf, UIP_BUFSIZE);return ret; } /*---------------------------------------------------------------------------*/ void tapdev_send(void) {int ret;ret = write(fd, uip_buf, uip_len); }void udp_receive_app(char * p){if(uip_newdata()){memcpy((char *)udp_send_databuf,uip_appdata,UIP_APPDATA_SIZE);uip_send(udp_send_databuf,UIP_APPDATA_SIZE); }}這樣數據是不會發送出來的,而且發送幾條后uip就會停止udp服務
只要不動uip_appdata,這樣是可以的(原因我也不清楚,很納悶,uip還是) void udp_test_app(char * p) {if(uip_newdata()){strcpy((char *)udp_send_databuf,"good news \n");uip_send(udp_send_databuf,11); //或者直接 uip_send("good news \n",11); } }
UDP的接收app里,沒有特殊處理,只能發送一條數據。
因為uip_send()只是把數據放入buf,然后通過在uip_polling()中輪詢發送。所以連續多條uip_send()時只發送最后那條。如
主要函數說明
uip_polling()
放在main主循環里的用戶函數,通過不同事件調用uip_process()
uip_process()
uip_process()都是通過類似定義來引用#define uip_input() uip_process(UIP_DATA)uip_polling都是通過以下函數來引用uip_process(),包括uip_input() 接收包處理uip_periodic(conn) TCP連接周期性處理uip_periodic_conn(conn) 制定TCP連接處理uip_poll_conn(conn) 輪詢特定連接uip_udp_periodic(conn) UDP周期性處理uip_udp_periodic_conn(conn) 特定UDP周期性處理總結
- 上一篇: 一款QQ盗号木马分析
- 下一篇: 使用xUnit.net 对 .net c