uip UDP客户端模式通信移植,本地端口可以随机

目前移植了UDP客户端模式,测试使用广播地址.


//udp_client.c

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************************************************************* 
  2.  * 文件名:         udp_client.c 
  3.  * 功能:          uIP UDP客户端相关函数 
  4.  * 作者:          cp1300@139.com 
  5.  * 创建时间:        2014-06-06 
  6.  * 最后修改时间:  2014-06-06 
  7.  * 详细:          UDP客户端相关函数 
  8. *************************************************************************************************************/    
  9. #include "SYSTEM.h"  
  10. #include "uip.h"  
  11. #include <string.h>  
  12. #include <stdio.h>      
  13. #include "uIP_user.H"  
  14. #include "AppClient.H"  
  15. #include "udp_client.h"  
  16.   
  17.   
  18. static struct uip_udp_conn *myudp_conn;  
  19.   
  20. u16 UDP_ClientPort = UDP_LOCAL_PORT;            //UDP本地端口  
  21. UIP_USER udp_client;                            //UDP 客户端数据结构  
  22.   
  23.   
  24.   
  25.   
  26.   
  27.   
  28. /************************************************************************************************************************* 
  29. * 函数            :   bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort) 
  30. * 功能            :   建立一个UDP客户端 
  31. * 参数            :   IpAddr:UDP服务器IP地址;ServerPort:服务器端口;ClientPort:客户端本地端口 
  32. * 返回            :   FALSE:失败;TRUE:成功 
  33. * 依赖            :   uip 
  34. * 作者            :   cp1300@139.com 
  35. * 时间            :   2014-06-06 
  36. * 最后修改时间    :   2014-06-06 
  37. * 说明            :   服务器必须指定端口,客户端端口为0则为随机端口 
  38. *************************************************************************************************************************/  
  39. bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort)  
  40. {  
  41.     uip_ipaddr_t ipaddr;  
  42.   
  43.       
  44.     uip_ipaddr(ipaddr, IpAddr0,IpAddr1,IpAddr2,IpAddr3);            //UDP服务器IP地址  
  45.     if(myudp_conn != NULL)  
  46.     {   
  47.         uip_udp_remove(myudp_conn);                                 //如果连接已经建立,则删除之  
  48.     }  
  49.     myudp_conn = uip_udp_new(&ipaddr, htons(ServerPort), ClientPort);//建立到远程ipaddr  
  50.     if(myudp_conn != NULL)                                          //连接建立成功  
  51.     {    
  52.         udp_client.RxLen = 0;  
  53.         udp_client.TxLen = 0;  
  54.         UDP_ClientPort = HTONS(myudp_conn->lport);                   //本地端口    
  55.         udp_client.ClientPort = UDP_ClientPort;  
  56.         udp_client.ServerPort =  HTONS(myudp_conn->rport);  
  57.         uart_printf("UDP 建立成功!本地端口:%d 服务器端口:%d\r\n",udp_client.ClientPort, udp_client.ServerPort);  
  58.         uip_udp_bind(myudp_conn, htons(UDP_ClientPort));            //绑定本地端口  
  59.         return TRUE;  
  60.     }  
  61.     else//连接建立失败  
  62.     {  
  63.         UDP_ClientPort = 0;                 //本地端口    
  64.         udp_client.ClientPort = 0;  
  65.         udp_client.ServerPort =  0;   
  66.         uart_printf("UDP 建立失败!\r\n");  
  67.         return FALSE;  
  68.     }  
  69.       
  70. }  
  71.   
  72.   
  73.   
  74.          
  75. /************************************************************************************************************************* 
  76. * 函数            :   void udp_client_appcall(void) 
  77. * 功能            :   UDP 客户端应用回调函数 
  78. * 参数            :   无 
  79. * 返回            :   无 
  80. * 依赖            :   uip 
  81. * 作者            :   cp1300@139.com 
  82. * 时间            :   2014-06-04 
  83. * 最后修改时间    :   2014-06-05 
  84. * 说明            :   无 
  85. *************************************************************************************************************************/  
  86. void udp_client_appcall(void)  
  87. {  
  88.     if (uip_newdata())  
  89.     {  
  90.         if(uip_datalen() > UIP_RX_BUFF_ZISE) uip_len = UIP_RX_BUFF_ZISE;//限制大小  
  91.         memcpy(udp_client.RxBuff, uip_appdata, uip_len);                //复制接收的数据到接收缓冲区  
  92.         udp_client.RxLen = uip_len;                                     //存储接收数据长度                                        
  93.     }  
  94.   
  95.     //新数据到达,轮询,发送数据   
  96.     if(udp_client.TxLen)   
  97.     {  
  98.         uip_send(udp_client.TxBuff, udp_client.TxLen);  //发送UDP数据包  
  99.         udp_client.TxLen = 0;  
  100.     }  
  101. }     
  102.   
  103.   
  104.   
  105.   
  106. /************************************************************************************************************************* 
  107. * 函数            :   void udp_SendDataPackage(u8 *pBuff, u16 len) 
  108. * 功能            :   UDP用户发送外部调用接口 
  109. * 参数            :   无 
  110. * 返回            :   无 
  111. * 依赖            :   uip 
  112. * 作者            :   cp1300@139.com 
  113. * 时间            :   2014-06-04 
  114. * 最后修改时间    :   2014-06-05 
  115. * 说明            :   由底层调度器进行调度自动发送 
  116. *************************************************************************************************************************/  
  117. void udp_SendDataPackage(u8 *pBuff, u16 len)  
  118. {  
  119.     if(len > UIP_TX_BUFF_ZISE) len = UIP_TX_BUFF_ZISE;  
  120.     memcpy(udp_client.TxBuff, pBuff, len);  
  121.     udp_client.TxLen = len;  
  122. }  


//udp_client.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************************************************************* 
  2.  * 文件名:         udp_client.h 
  3.  * 功能:          uIP UDP客户端相关函数 
  4.  * 作者:          cp1300@139.com 
  5.  * 创建时间:        2014-06-06 
  6.  * 最后修改时间:  2014-06-06 
  7.  * 详细:          UDP客户端相关函数 
  8. *************************************************************************************************************/    
  9. #ifndef _UDP_CLIENT_H_  
  10. #define _UDP_CLIENT_H_  
  11. #include "tcp.h"  
  12. #include "uip.h"  
  13. #include "system.h"  
  14. #include "uIP_user.h"  
  15.   
  16. extern u16 UDP_ClientPort;      //UDP 客户端本地端口  
  17. extern UIP_USER udp_client;     //UDP 客户端数据结构  
  18.   
  19.   
  20. bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort); //建立一个UDP客户端  
  21. void udp_client_appcall(void);                  //UDP 客户端应用回调函数  
  22. void udp_SendDataPackage(u8 *pBuff, u16 len);   //UDP用户发送外部调用接口  
  23.   
  24. #endif //_UDP_CLIENT_H_  



测试线程

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. udp_server_connected(UDP_SERVER_PORT, 0);                               //新建UDP服务器,客户端任意端口  
  2. udp_client_reconnect(255,255,255,255,UDP_REMOTE_PORT,UDP_LOCAL_PORT);   //广播方式连接服务器  
  3.   
  4. while(1)  
  5. {  
  6.     UIP_MutexPen();                     //申请信号量  
  7.       
  8.     //UDP通信处理  
  9.     if(udp_client.RxLen > 0)  
  10.     {  
  11.         uart_printf("UDP客户端\r\n");  
  12.         uart_printf("服务器端口:%d\r\n",udp_client.ServerPort);  
  13.         uart_printf("客户端端口:%d\r\n",udp_client.ClientPort);  
  14.         uart_printf("UDP Server Rx(%dB):%s\r\n",udp_client.RxLen,(char*)udp_client.RxBuff);  
  15.         udp_SendDataPackage(udp_client.RxBuff, udp_client.RxLen);  
  16.         udp_client.RxLen = 0;  
  17.     }  
  18.       
  19.     //UDP服务器数据处理  
  20.     if(udp_server.RxLen > 0)  
  21.     {  
  22.         uart_printf("UDP服务器\r\n");  
  23.         uart_printf("服务器端口:%d\r\n",udp_server.ServerPort);  
  24.         uart_printf("客户端端口:%d\r\n",udp_server.ClientPort);  
  25.         uart_printf("UDP Server Rx(%dB):%s\r\n",udp_server.RxLen,(char*)udp_server.RxBuff);  
  26.         udp_ServerSendDataPackage(udp_server.RxBuff, udp_server.RxLen, udp_server.ClientPort);  
  27.         udp_server.RxLen = 0;  
  28.     }  
  29.       
  30.     UIP_MutexPost();                        //释放信号量  
  31.     if(isGetIP == FALSE) goto Udp_Reset;    //掉线后重新初始化  
  32.     OSTimeDlyHMSM(0,0,0,100);  
  33. }  


需要修改uip_udp_new

添加一个简单的随机数产生本地随机端口

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /*---------------------------------------------------------------------------*/  
  2. //注意,rport:需要htons(xxxx)  
  3. //lport:0系统随机端口;否则:指定端口,无需htons(),直接输入即可  
  4. #if UIP_UDP  
  5. struct uip_udp_conn *  
  6. uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport, u16 lport)  
  7. {  
  8.   register struct uip_udp_conn *conn;  
  9.     
  10.   /* Find an unused local port. */  
  11.  again:  
  12.     if(lport == 0)  //随机端口  
  13.     {  
  14.         //++lastport;  
  15.         lastport = 1024+UIP_GetRandom()%3096+UIP_GetRandom()%1024;  
  16. //      if(lastport >= 32000)   
  17. //      {  
  18. //          lastport = 4096;  
  19. //      }         
  20.     }  
  21.     else lastport = lport;  //指定端口  
  22.     
  23.   for(c = 0; c < UIP_UDP_CONNS; ++c) {  
  24.     if(uip_udp_conns[c].lport == htons(lastport)) {  
  25.       goto again;  
  26.     }  
  27.   }  


测试截图



一般的调试软件的UDP服务器模式都不好用或者没有,我使用的是别人的一款上位机中的UDP广播搜索模式进行测试的.

posted @ 2016-08-08 12:49  SuperThinker  阅读(6)  评论(0编辑  收藏  举报  来源