uip UDPclient模式通信移植,当地port随机
生活随笔
收集整理的這篇文章主要介紹了
uip UDPclient模式通信移植,当地port随机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在移植UDPclient模式,測試廣播地址.
//udp_client.c
/************************************************************************************************************** 文件名稱: udp_client.c* 功能: uIP UDP客戶端相關函數* 作者: cp1300@139.com* 創建時間: 2014-06-06* 最后改動時間: 2014-06-06* 具體: UDP客戶端相關函數 *************************************************************************************************************/ #include "SYSTEM.h" #include "uip.h" #include <string.h> #include <stdio.h> #include "uIP_user.H" #include "AppClient.H" #include "udp_client.h"static struct uip_udp_conn *myudp_conn;u16 UDP_ClientPort = UDP_LOCAL_PORT; //UDP本地port UIP_USER udp_client; //UDP 客戶端數據結構/************************************************************************************************************************* * 函數 : bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort) * 功能 : 建立一個UDP客戶端 * 參數 : IpAddr:UDPserverIP地址;ServerPort:serverport;ClientPort:客戶端本地port * 返回 : FALSE:失敗;TRUE:成功 * 依賴 : uip * 作者 : cp1300@139.com * 時間 : 2014-06-06 * 最后改動時間 : 2014-06-06 * 說明 : server必須指定port,客戶端port為0則為隨機port *************************************************************************************************************************/ bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort) {uip_ipaddr_t ipaddr;uip_ipaddr(ipaddr, IpAddr0,IpAddr1,IpAddr2,IpAddr3); //UDPserverIP地址if(myudp_conn != NULL){ uip_udp_remove(myudp_conn); //假設連接已經建立。則刪除之}myudp_conn = uip_udp_new(&ipaddr, htons(ServerPort), ClientPort);//建立到遠程ipaddrif(myudp_conn != NULL) //連接建立成功{ udp_client.RxLen = 0;udp_client.TxLen = 0;UDP_ClientPort = HTONS(myudp_conn->lport); //本地port udp_client.ClientPort = UDP_ClientPort;udp_client.ServerPort = HTONS(myudp_conn->rport);uart_printf("UDP 建立成功!本地port:%d serverport:%d\r\n",udp_client.ClientPort, udp_client.ServerPort);uip_udp_bind(myudp_conn, htons(UDP_ClientPort)); //綁定本地portreturn TRUE;}else//連接建立失敗{UDP_ClientPort = 0; //本地port udp_client.ClientPort = 0;udp_client.ServerPort = 0; uart_printf("UDP 建立失敗!\r\n");return FALSE;}}/************************************************************************************************************************* * 函數 : void udp_client_appcall(void) * 功能 : UDP 客戶端應用回調函數 * 參數 : 無 * 返回 : 無 * 依賴 : uip * 作者 : cp1300@139.com * 時間 : 2014-06-04 * 最后改動時間 : 2014-06-05 * 說明 : 無 *************************************************************************************************************************/ void udp_client_appcall(void) {if (uip_newdata()){if(uip_datalen() > UIP_RX_BUFF_ZISE) uip_len = UIP_RX_BUFF_ZISE;//大小限制memcpy(udp_client.RxBuff, uip_appdata, uip_len); //復制接收的數據到接收緩沖區udp_client.RxLen = uip_len; //存儲接收數據長度 }//新數據到達,輪詢,發送數據 if(udp_client.TxLen) {uip_send(udp_client.TxBuff, udp_client.TxLen); //發送UDP數據包udp_client.TxLen = 0;} } /************************************************************************************************************************* * 函數 : void udp_SendDataPackage(u8 *pBuff, u16 len) * 功能 : UDP用戶發送外部調用接口 * 參數 : 無 * 返回 : 無 * 依賴 : uip * 作者 : cp1300@139.com * 時間 : 2014-06-04 * 最后改動時間 : 2014-06-05 * 說明 : 由底層調度器進行調度自己主動發送 *************************************************************************************************************************/ void udp_SendDataPackage(u8 *pBuff, u16 len) {if(len > UIP_TX_BUFF_ZISE) len = UIP_TX_BUFF_ZISE;memcpy(udp_client.TxBuff, pBuff, len);udp_client.TxLen = len; }測試線程 udp_server_connected(UDP_SERVER_PORT, 0); //新建UDP服務器,客戶端隨意portudp_client_reconnect(255,255,255,255,UDP_REMOTE_PORT,UDP_LOCAL_PORT); //廣播方式連接服務器while(1){UIP_MutexPen(); //申請信號量//UDP通信處理if(udp_client.RxLen > 0){uart_printf("UDP客戶端\r\n");uart_printf("服務器port:%d\r\n",udp_client.ServerPort);uart_printf("客戶端port:%d\r\n",udp_client.ClientPort);uart_printf("UDP Server Rx(%dB):%s\r\n",udp_client.RxLen,(char*)udp_client.RxBuff);udp_SendDataPackage(udp_client.RxBuff, udp_client.RxLen);udp_client.RxLen = 0;}//UDP服務器數據處理if(udp_server.RxLen > 0){uart_printf("UDP服務器\r\n");uart_printf("服務器port:%d\r\n",udp_server.ServerPort);uart_printf("客戶端port:%d\r\n",udp_server.ClientPort);uart_printf("UDP Server Rx(%dB):%s\r\n",udp_server.RxLen,(char*)udp_server.RxBuff);udp_ServerSendDataPackage(udp_server.RxBuff, udp_server.RxLen, udp_server.ClientPort);udp_server.RxLen = 0;}UIP_MutexPost(); //釋放信號量if(isGetIP == FALSE) goto Udp_Reset; //掉線后又一次初始化OSTimeDlyHMSM(0,0,0,100);}}
須要改動uip_udp_new
加入一個簡單的隨機數產生本地隨機port
/*---------------------------------------------------------------------------*/ //注意,rport:須要htons(xxxx) //lport:0系統隨機端口;否則:指定端口,無需htons(),直接輸入就可以 #if UIP_UDP struct uip_udp_conn * uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport, u16 lport) {register struct uip_udp_conn *conn;/* Find an unused local port. */again:if(lport == 0) //隨機端口{//++lastport;lastport = 1024+UIP_GetRandom()%3096+UIP_GetRandom()%1024; // if(lastport >= 32000) // { // lastport = 4096; // } }else lastport = lport; //指定端口for(c = 0; c < UIP_UDP_CONNS; ++c) {if(uip_udp_conns[c].lport == htons(lastport)) {goto again;}}測試截圖
通用調試軟件UDPserver模式不容易使用或不,我正在使用別人的電腦UDP測試廣播搜索模式.
轉載于:https://www.cnblogs.com/yxwkf/p/4591526.html
總結
以上是生活随笔為你收集整理的uip UDPclient模式通信移植,当地port随机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql授权语句
- 下一篇: CCNA配置试验之七 PPP中PAP和C