现在移植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);//建立到远程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本地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服务器,客户端随意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_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测试广播搜索模式.

uip UDPclient模式通信移植,当地port随机的更多相关文章

  1. uip UDPclient模式通信移植,p本地ort可以是无规

    现在移植UDPclient模式,使用广播地址检测. //udp_client.c /********************************************************** ...

  2. uip UDP server广播模式(client能够随意port,而且主动向client发送数据)

    眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clien ...

  3. STM32 USB-HID通信移植步骤

    大家可以使用压缩包中的UsbApp.exe调试本软件idVendor为:0483  idProduct为5750. 今天太晚了,明天还要上半天班,上位机软件找个时间在写一篇文章.请关注我的博客.压缩包 ...

  4. FTP模式简式:PORT/PASV/EPRT/EPSV

    简介 常见FTP有两种模式:PORT(主动模式).PASV(被动模式). 而EPRT/EPSV模式出现的原因是FTP仅仅提供了建立在IPv4上进行数据通信的能力,它基于网络地址是32位这一假设.但是, ...

  5. TMS320VC5509的MCBSP配置成SPI模式通信

    1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ...

  6. Cloud Foundry中DEA与warden通信完毕应用port监听

    在Cloud Foundry v2版本号中,DEA为一个用户应用执行的控制模块,而应用的真正执行都是依附于warden. 更详细的来说,是DEA接收到Cloud Controller的请求:DEA发送 ...

  7. 用户模式 Linux 移植

    用户模式 Linux (UML) 是一个有趣的概念. 它被构建为一个分开的 Linux 内核移植, 有 它自己的 arch/um 子目录. 它不在一个新的硬件类型上运行, 但是; 相反, 它运行在一 ...

  8. 基于C#的UDP通信(使用UdpClient实现,包含发送端和接收端)

    UDP不属于面向连接的通信,在选择使用协议的时候,选择UDP必须要谨慎.在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重.但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小, ...

  9. FTP出现PORT模式成功, 请更新你的站点配置文件

    最近用FTP连接站点,经常出现连接不上或者连接失败,提示以PASV模式连接失败,正在使用PORT模式连接,最后才能连接成功,连接时间也是相当长,又慢又不稳定.   工具/原料   FlashFXP等F ...

随机推荐

  1. Swift - 类的计算属性(使用get和set来间接获取/改变其他属性的值)

    1,Swift中类可以使用计算属性,即使用get和set来间接获取/改变其他属性的值,代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Calc ...

  2. IE7IE8兼容性设置_服务器端设定

    用ASP.NET开发的web程序,客户端是IE7以上时,需要设置IE的兼容性,否则web页面可能混乱,但这样在每客户端设置不太现实, 对策: ①在站点的配置文件中,修改web.config文件,使得该 ...

  3. 与众不同 windows phone (23) - Device(设备)之硬件状态, 系统状态, 网络状态

    原文:与众不同 windows phone (23) - Device(设备)之硬件状态, 系统状态, 网络状态 [索引页][源码下载] 与众不同 windows phone (23) - Devic ...

  4. QS Network(最小生成树)

    题意:若两个QS之间要想连网,除了它们间网线的费用外,两者都要买适配器, 求使所有的QS都能连网的最小费用. 分析:这个除了边的权值外,顶点也有权值,因此要想求最小价值,必须算边及顶点的权值和. 解决 ...

  5. Tiny Mapper是一个.net平台开源的对象映射组件

    NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper   阅读目录 1.Tiny Mapper基本介绍 2.Tiny Mapper 基本使用 3.Tiny Mapper 指定配置使用 ...

  6. Java---25---集合框架共性方法

    集合类 为什么会出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便对较多个对象的操作,就对对象进行存储,集合就是存储对象最经常使用的一种方式 数组和集合类同一时候容器,有何不同? 数组 ...

  7. hdu1881(贪心+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 分析:按照结束时间从小到大排序,然后以每个结束点为容量进行01背包,选入的必定符合条件的. 因为 ...

  8. UVA 11100 The Trip, 2007 贪心(输出比较奇葩)

    题意:给出n个包的大小,规定一个大包能装一个小包,问最少能装成几个包. 只要排序,然后取连续出现次数最多的数的那个次数.输出注意需要等距输出. 代码: /* * Author: illuz <i ...

  9. ios多线程操作(五)—— GCD串行队列与并发队列

          GCD的队列能够分为2大类型,分别为串行队列和并发队列      串行队列(Serial Dispatch Queue):      一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...

  10. SQL SERVER中的流程控制语句

    流程控制语句 是指用来控制程序运行和流程分至点额命令.一般指的是逻辑计算部分的控制. 1.Begin End语句 封装了多个T-SQL语句组合,将他们组成一个单元来处理. 一般在条件查询或者循环等控制 ...