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_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本地port
extern UIP_USER udp_client;		//UDP client数据结构bool udp_client_reconnect(u8 IpAddr0,u8 IpAddr1,u8 IpAddr2,u8 IpAddr3, u16 ServerPort, u16 ClientPort);	//建立一个UDPclient
void 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服务器,客户端随意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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react如何遍历并比较_[前端进阶] 这可能是最通俗易懂的React 渲染原理及性能优化...

如今的前端&#xff0c;框架横行&#xff0c;出去面试问到框架是常有的事。我比较常用React&#xff0c; 这里就写了一篇 React 基础原理的内容&#xff0c; 面试基本上也就问这些&#xff0c; 分享给大家。React 是什么React是一个专注于构建用户界面的 Javascript Library.一…

运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt

离散数学包含及排斥原理第三章 集合与关系 * 一、有限集的计数 一个集合若其组成集合的元素个数是有限的&#xff0c;则称作有限集。 设A1、A2为素个数分别记为|A1|&#xff0c;|A2| P96有限集记数有如下几个性质&#xff1a; a)|A1∪A2| ≤ |A1||A2| b)|A1∩A2| ≤min( |A1|,|…

基于git的工作流程

本文针对的是追求极致、快速的产品响应团队的。以下的观点和内容都是围绕这个主题&#xff0c;暂时不涉及个人学习和团队学习。 在说工作流程之间&#xff0c;想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里&#xff0c;同时有好多事件要解决。有的是产品迭代&a…

c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

在C中&#xff0c;继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承&#xff0c;您可以重用&#xff0c;扩展或修改在其他类中定义的属性和行为。通过继承&#xff0c;可以实现函数重写以及多态。在C中&#xff0c;继承另一个类的成员的类称为派生类&#xff0…

超几何分布_常见概率分布

离散分布退化分布 若r.v. 只取常数值c&#xff0c;即 ,这时分布函数为&#xff1a; 把这种分布称为退化分布或者单点分布。伯努利分布 在一次实验中&#xff0c;事件A出现的概率为 ,不出现的概率为 ,若用 记事件A出现的次数&#xff0c;则 仅取值0或1&#xff0c;相应的…

spring 4.0 JUnit简单的Dao,Service测试

1.AbstractTransactionalJUnit4SpringContextTests 和AbstractJUnit4SpringContextTests。我们在测试用例类要继承两种中的一个。 AbstractTransactionalJUnit4SpringContextTests提供了数据库自动回滚&#xff0c;也就是说测试前和测试后数据库是一样的 AbstractJUnit4SpringC…

云起智慧中心连接华为_【转发】华为智慧屏HiLink控制联动,操作指南来了!

本文转自华为智慧生活APP -> 智能 -> 酷玩页面华为智慧屏HiLink控制联动&#xff0c;操作指南来了&#xff01;一、基本控制通过华为智慧生活APP&#xff0c;您可以对已绑定华为账号的智慧屏进行基本控制&#xff0c;操作指南如下&#xff1a;① 在智慧屏上登录华为账号&…

中小学电教信息计算机管理员职责,中小学电教教师岗位职责

第1篇&#xff1a;电教教师岗位职责电教教师岗位目标责任书一、根据学校工作计划制定学校电教工作计划。二、根据学校需要&#xff0c;收集、编制电教教材和资料。三、管理好电教教室、器材和设施&#xff0c;严格执行器材的使用归还制度。四、电教器材使用设置合理&#xff0c…

python编程口诀_少儿Python编程中的算术与技巧

在儿童Python中&#xff0c;使用数值进行基本运算的情况很常见。加、减、乘、除都是内置的。加法和减法通过和-号执行。 在Python shell提示中可以输入基本的算术表达式&#xff0c;将它当作一个计算机来使用。像计算器一样&#xff0c;Python接受一组操作&#xff0c;当按下En…

struts学习

Structs2配置文件概述&#xff1a; <constant name"" value""></constant>详解&#xff1a;&#xff08;两个看不见的value都是设置true/false&#xff09; package的相关使用&#xff1a; &#xff08;name是包名。action相当于以前的servl…

里怎么做页眉页脚_这年头县城里在家做的电商利润怎么样

这年头县城里在家做的电商利润怎么样 mcfg6ek这年头县城里在家做的电商利润怎么样 通过上面的信息大家是否已经对多用户商城有什么优势有所了解了呢&#xff0c;如果还想了解更多多用户商城的信息&#xff0c;站进行查看咨询哦。店系统怎么进行推广。店系统的推广方式介绍我们都…

计算机如果算积分排名,超级电脑预测英超积分榜:蓝军守住第4 曼联无缘欧冠...

还有6天的时间&#xff0c;2019-20赛季的英超联赛就要重启了。虽然冠军的悬念已经不大&#xff0c;但欧冠席位以及降级名额仍有很大的变数&#xff0c;这让外界仍无比期待接下来的比赛。今日&#xff0c;超级计算机对剩余的比赛做了预测&#xff0c;并算出了最终的积分榜&#…

环形队列出队的元素怎么输出出来_队列:队列在线程池等有限资源池中的应用...

我们知道&#xff0c;CPU资源是有限的&#xff0c;任务的处理速度与线程个数并不是线性正相关的。相反&#xff0c;过多的线程反而会导致CPU频繁切换&#xff0c;处理性能下降。所以&#xff0c;线程池的大小一般都是综合考虑要处理任务的特点和硬件环境&#xff0c;来事先设置…

★★★常用的【兼容IE和火狐FF】等浏览器的js方法★★★★★★★★

这是一篇收集的文档&#xff0c;介绍了网页上常用的IE/火狐兼容性该页的做法&#xff0c;并给出了代码&#xff0c;相当实用了。为了方便大家阅读代码&#xff0c;以下以 IE 代替 Internet Explorer&#xff0c;以 MF/FF 代替 Mozzila Firefox 。 以下进入正题&#xff1a; 一、…

英语答题测试的软件叫什么,英语做题软件哪个好 有答案解析的英语做题软件分享...

对于一些即将参与重要英语考试的考生来说&#xff0c;每天刷题练习肯定是不可避免的事情&#xff0c;但如果你想要更高效的刷题&#xff0c;让自己的刷题时间更有价值&#xff0c;那就来看看推荐给你的这些英语做题软件。类型&#xff1a;学习 语言&#xff1a;简体中文星级&am…

raid卡组不同raid_RAID磁盘阵列是如何运作的?

本文编辑&#xff1a;意哥专业指导&#xff1a;葵芳一凡 RAID是英文Redundant Array of Independent Disks的缩写&#xff0c;中文简称为独立冗余磁盘阵列。简单的说&#xff0c;RAID是一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组…

java 析构函数_C++虚函数

码字不易&#xff0c;欢迎给个赞&#xff01;C虚函数是多态性实现的重要方式&#xff0c;当某个虚函数通过指针或者引用调用时&#xff0c;编译器产生的代码直到运行时才能确定到底调用哪个版本的函数。被调用的函数是与绑定到指针或者引用上的对象的动态类型相匹配的那个。因此…

.net中使用XPath语言在xml中判断是否存在节点值的方法

book.xml<?xml version"1.0" encoding"utf-8" ?> <bookstore><book category"COOKING"><title lang"en">Everyday Italian</title><author>Giada De Laurentiis</author><year>200…

象过河软件试用版_比肩许银川蒋川王天一,象棋软件下出神一样的残局,看完叹为观止...

古语有云&#xff0c;残局&#xff0c;是一盘棋的命脉所在。这对于现代象棋而言&#xff0c;也是如此&#xff0c;君不见&#xff0c;许银川有着鬼魅残功&#xff0c;蒋川有着魔衣血刀&#xff0c;王天一有着天外飞仙&#xff0c;都是一等一的残棋神器。而被誉为棋界战斗力最为…

python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)

一、乱码问题描述 经常在爬虫或者一些操作的时候&#xff0c;经常会出现中文乱码等问题&#xff0c;如下原因是源网页编码和爬取下来后的编码格式不一致 二、利用encode与decode解决乱码问题 字符串在Python内部的表示是unicode编码&#xff0c;在做编码转换时&#xff0c;通常…