博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uip UDPclient模式通信移植,p本地ort可以是无规
阅读量:6257 次
发布时间:2019-06-22

本文共 6218 字,大约阅读时间需要 20 分钟。

现在移植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 
#include
#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本地portUIP_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);//建立到远程ipaddr if(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)); //绑定本地port return 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_client.h

/************************************************************************************************************* * 文件名称:			udp_client.h * 功能:			uIP UDPclient相关函数 * 作者:			cp1300@139.com * 创建时间:		2014-06-06 * 最后改动时间:	2014-06-06 * 具体:			UDPclient相关函数*************************************************************************************************************/	#ifndef _UDP_CLIENT_H_#define _UDP_CLIENT_H_#include "tcp.h"#include "uip.h"#include "system.h"#include "uIP_user.h"extern u16 UDP_ClientPort;		//UDP client本地portextern UIP_USER udp_client;		//UDP client数据结构bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort);	//建立一个UDPclientvoid udp_client_appcall(void);					//UDP client应用回调函数void udp_SendDataPackage(u8 *pBuff, u16 len);	//UDP用户发送外部调用接口#endif //_UDP_CLIENT_H_
測试线程

udp_server_connected(UDP_SERVER_PORT, 0);								//新建UDP服务器,客户端随意port	udp_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_UDPstruct 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测试广播搜索模式.

你可能感兴趣的文章
在Windows Server 2008 R2上安装Exchange 2013过程中遇到的一些问题
查看>>
Maven POM入门
查看>>
codeforces 6A. Triangle
查看>>
仿CSDN Blog返回页面顶部功能
查看>>
【HTML5游戏开发小技巧】RPG情形对话中,令文本逐琢夸出
查看>>
ORA-04031:
查看>>
早晚有一天,我们都会成为自己当初讨厌的人
查看>>
基于SMTP协议的CMD命令邮件发送
查看>>
九度笔记之 1209最小邮票数
查看>>
Java中swap解惑
查看>>
HDU 2068 RPG的错排
查看>>
操作数有自增操作时复合表达式的陷阱
查看>>
从WW中剥离一个三维场景框架
查看>>
ASP.NET网页动态添加、更新或删除数据行
查看>>
vbs获取当前主机IP
查看>>
IIS7中的站点、应用程序和虚拟目录详细介绍
查看>>
为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
查看>>
对Map按key和value分别排序
查看>>
知名第三方编译版tete009 Firefox 24.0
查看>>
java反射生成ORM
查看>>