1、用到的函數。服務器
獲取鏈接函數 app
struct uip_udp_conn * udp_new(const uip_ipaddr_t *ripaddr, uint16_t port, void *appstate) tcp
參數: ripaddr -- 遠端 ip函數
port -- 遠端端口ui
appstate -- 鏈接過程當中須要用到的數據,該數據會以event中的data傳遞。spa
返回值: uip_udp_conn -- udp的鏈接,但系統沒有空閒的鏈接的時候,則返回NULL。code
端口綁定宏orm
#define udp_bind(conn, port) uip_udp_bind(conn, port)server
展開以下:進程
#define uip_udp_bind(conn, port) (conn)->lport = port
做用是綁定鏈接的本地端口。
3. 數據發送函數
void uip_udp_packet_send(struct uip_udp_conn *c, const void *data, int len)
參數: c -- 使用udp_new分配的鏈接。
data -- 須要發送的數據。
len -- 須要發送的數據的長度。
返回值: void
2、udp server
#include "contiki.h" #include "contiki-net.h" struct uip_udp_conn *server_conn = NULL; uint8_t buf[32]; #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len]) PROCESS(udp_server, "udp server"); PROCESS_THREAD(udp_server, ev, data) { int len; PROCESS_BEGIN(); // 分配鏈接 // 分配鏈接的時候 server_conn 會記錄當前的進程,以便有事件產生的時候調用該進程。 // 若是下面的第二個參數不爲0 (UIP_HTONS(0)),則該服務端只能接受到客戶端的端口爲該參數的數據。 server_conn = udp_new(NULL, UIP_HTONS(0), NULL); // 設置監聽端口 udp_bind(server_conn, UIP_HTONS(3030)); // 接收到數據 while (1) { if (ev == tcpip_event) { // udp_new 函數中的 appstate 會跟 ev 一塊兒傳進來 // 當接收到數據的時候 uip_newdata() > 0 if (uip_newdata()) { // 收到的數據長度 len = uip_datalen(); if (len > 32) len = 32; // 獲取客戶端發送的數據 memcpy(buf, uip_appdata, len); // 獲取客戶端的端口和 IP server_conn->rport = UIP_UDP_BUF->srcport; uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr); uip_udp_packet_send(server_conn, buf, len); // 發送數據後,若是不須要該客戶端了,則須要釋放該遠程端口,否則會別的客戶端不能鏈接上來 uip_create_unspecified(&server_conn->ripaddr); server_conn->rport = 0; } } } PROCESS_END(); }
3、udp client
#include "contiki.h" #include "contiki-net.h" struct uip_udp_conn *client_conn = NULL; uint8_t buf[32]; #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len]) PROCESS(udp_client, "udp client"); PROCESS_THREAD(udp_client, ev, data) { static uip_ipaddr_t ipaddr; // 服務器地址 PROCESS_BEGIN(); uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1); // 分配鏈接 // 設置服務器地址以及端口 client_conn = udp_new(&ipaddr, UIP_HTONS(3030), NULL); // 若是server指定了客戶端的端口,則須要調用下面函數 // udp_bind(client_conn, UIP_HTONS(3031)); buf[0] = 0x01 uip_udp_packet_send(client_conn, buf, 1); // 當使用完該鏈接以後,則須要釋放該鏈接,不然會致使conn分配完畢,不能再次分配 uip_udp_remove(client_conn); PROCESS_END(); }