書籍:《嵌入式網絡那些事-lwip協議》
udp協議的優點:
1)基於IP協議,無連接的用戶數據報協議,適用於傳送大批量數據,
2)實時性比較高,適用於嵌入式網絡
發送函數:udp_send udp_sendto 兩個函數都可以用來發送報文,后者指定發送的目的ip地址,前者需要通過與ip層交互,獲取有效的ip地址,然后調用后者完成數據的發送。
udp_sendto通過調用函數udp_sendto_if完成報文的組裝和發送,在調用udp_sendto_if之前,與IP層進行交互操作,機調用ip_route為報文尋找一個網絡接口結構,這個結構記錄了整個系統的有效IP地址
報文接收函數
udp_input被調用處理報文,主要進行報文合法性檢測,根據報文端口信息查找匹配的UDP控制塊,並把報文數據遞交給控制塊中注冊的用戶自定義函數處理。
udp編程接口,采用回調函數的方式,優點-編程簡單,只需要綁定對應IP和端口后,編寫自己的處理函數,然后通過udp_recv函數注冊用戶的回調函數。不過采用回調方式編程存在缺陷,用戶應用程序和協議棧內核處於同一進程中,用戶程序通過回調的方式執行,在用戶程序執行的過程中,內核進程處於阻塞狀態,如果用戶程序比較大,處理時間較長,協議棧內核代碼得不到執行,協議棧接收,處理新數據包效率會受到直接的影響。最嚴重的后果,如果發送方的數據包發送速率很快,協議棧會因為來不及處理而出現丟包的情況。
/**************************************************************************/
回調方式編程的基本框架:
系統時鍾更新
SystemCoreClockUpdate();
初始化mac層,
Chip_ENET_Init(LPC_ETHERNET);
使能系統滴答定時器
SysTick_Enable(1);
初始化lwip協議棧
lwip_init();
初始化本機ip
IP4_ADDR(&gw, 192,168,1,1);//網關地址
IP4_ADDR(&ipaddr, 192,168,1,37);//本機IP地址
IP4_ADDR(&netmask, 255, 255, 255, 0);//子網掩碼
注冊網絡接口
netif_add(&lpc_netif, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init,ethernet_input);
netif_set_default(&lpc_netif);
netif_set_up(&lpc_netif);
啟動DHCP功能
dhcp_start(&lpc_netif);
申請一個UDP控制塊
upcb = udp_new();
綁定到本地端口
udp_bind(upcb,IP_ADDR_ANY,UDP_ECHO_PORT);
注冊用戶報文處理函數
udp_recv(upcb,udp_demo_callback,NULL);