uip UDP server广播模式(client能够随意port,而且主动向client发送数据)
眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clientport设置为0了,我通过将原始数据包中的clientport保存下来,而且在发送的时候将clientport替换为指定的port,发送完毕之后又设置为0,这样就实现了向随意clientport发送数据.
uip.c
if(uip_udp_conn->lport != 0 &&
UDPBUF->destport == uip_udp_conn->lport &&
(uip_udp_conn->rport == 0 ||
UDPBUF->srcport == uip_udp_conn->rport) &&
(uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) ||
uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) ||
uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) {
(uip_udp_conn->rport == 0 ||
UDPBUF->srcport == uip_udp_conn->rport) &&
这句就限制了client端口为0或者指定端口
//udp_server.c
/*************************************************************************************************************
* 文件名称: udp_server.h
* 功能: uIP UDP服务器相关函数
* 作者: cp1300@139.com
* 创建时间: 2014-06-04
* 最后改动时间: 2014-06-04
* 具体: UDP服务器相关函数
*************************************************************************************************************/
#include "SYSTEM.h"
#include "tapdev.h"
#include "uip.h"
#include <string.h>
#include <stdio.h>
#include "uIP_user.h"
#include "udp_server.h"
#include "appconfig.h" u16 UDP_ServerPort = UDP_SERVER_PORT; //UDP服务器本地port,用于新数据port识别
UIP_USER udp_server; //UDP 服务器数据结构
static bool isAnyPort = FALSE; //client随意port标志 /*************************************************************************************************************************
* 函数 : void udp_server_connected(u16 ServerPort,u16 ClientPort)
* 功能 : 建立一个UDP服务器(广播方式)
* 參数 : ServerPort:服务器本地port,ClientPort:clientport,0:随意port;非0:指定port
* 返回 : 无
* 依赖 : uip
* 作者 : cp1300@139.com
* 时间 : 2014-06-04
* 最后改动时间 : 2014-06-05
* 说明 : 必须放在UDPclient初始化之前
*************************************************************************************************************************/
void udp_server_connected(u16 ServerPort,u16 ClientPort)
{
UDP_ServerPort = ServerPort; //本地port
uip_listen(HTONS(ServerPort));
uip_udp_bind(&uip_udp_conns[0], htons(ServerPort)); //绑定本地port
udp_server.RxLen = 0;
udp_server.TxLen = 0;
udp_server.ServerPort = ServerPort; //服务器port
if(ClientPort != 0) //指定port
{
uip_udp_conns[0].rport = HTONS(ClientPort);
udp_server.ClientPort = ClientPort;
isAnyPort = FALSE; //client指定port
}
else
{
uip_udp_conns[0].rport = 0;
isAnyPort = TRUE; //client随意port
}
} /*************************************************************************************************************************
* 函数 : void udp_server_appcall(void)
* 功能 : 服务器回调函数,用于uip处理数据
* 參数 : 无
* 返回 : 无
* 依赖 : uip
* 作者 : cp1300@139.com
* 时间 : 2014-06-04
* 最后改动时间 : 2014-06-05
* 说明 : 无
*************************************************************************************************************************/
void udp_server_appcall(void)
{ if (uip_newdata())
{
if(uip_datalen() > UIP_RX_BUFF_ZISE) uip_len = UIP_RX_BUFF_ZISE; //大小限制
memcpy(udp_server.RxBuff, uip_appdata, uip_len); //复制接收的数据到接收缓冲区
udp_server.RxLen = uip_len; //存储接收数据长度
udp_server.ClientPort = (u16)(uip_buf[34]<<8) | uip_buf[35]; //强制获取clientport地址
//uart_printf("%s\r\n",(char*)uip_appdata);
}
//新数据到达,轮询,发送数据
if(uip_newdata() || uip_poll())
{
if(udp_server.TxLen)
{
uip_send(udp_server.TxBuff, udp_server.TxLen); //发送UDP数据包
udp_server.TxLen = 0;
}
}
} /*************************************************************************************************************************
* 函数 : void udp_ServerSendDataPackage(u8 *pBuff, u16 len,u16 ClientPort)
* 功能 : UDP 服务器发送数据
* 參数 : pBuff:发送数据缓冲区,len:发送数据长度,ClientPort:clientport
* 返回 : 无
* 依赖 : uip
* 作者 : cp1300@139.com
* 时间 : 2014-06-04
* 最后改动时间 : 2014-06-05
* 说明 : 无
*************************************************************************************************************************/
void udp_ServerSendDataPackage(u8 *pBuff, u16 len,u16 ClientPort)
{
if(len > UIP_TX_BUFF_ZISE) len = UIP_TX_BUFF_ZISE;
memcpy(udp_server.TxBuff, pBuff, len);
udp_server.TxLen = len;
uip_udp_conns[0].rport = HTONS(ClientPort); //临时将clientport设置为上一次发送数据的clientport
} /*************************************************************************************************************************
* 函数 : void udp_ServerSendEndCallBack(u16 conn)
* 功能 : UDP发送数据完毕回调函数,眼下仅仅支持一个服务器port
* 參数 : pBuff:发送数据缓冲区,len:发送数据长度,ClientPort:clientport
* 返回 : 无
* 依赖 : uip
* 作者 : cp1300@139.com
* 时间 : 2014-06-04
* 最后改动时间 : 2014-06-05
* 说明 : 因为UDP服务器的clientIP设置为0后能够接收随意port发来的数据,可是却无法发送数据
到0port,因此在发送前将clientport设置为实际port,发送完毕后改动为0
*************************************************************************************************************************/
void udp_ServerSendEndCallBack(u16 conn)
{
if((conn == 0) && (isAnyPort == TRUE))
{
uip_udp_conns[conn].rport = 0; //将port设置为0
}
}
//udp_server.h
/*************************************************************************************************************
* 文件名称: udp_server.h
* 功能: uIP UDPserver相关函数
* 作者: cp1300@139.com
* 创建时间: 2014-06-04
* 最后改动时间: 2014-06-04
* 具体: UDPserver相关函数
*************************************************************************************************************/
#ifndef _UDP_SERVER_H_
#define _UDP_SERVER_H_
#include "tcp.h"
#include "uip.h"
#include "system.h"
#include "uIP_user.h" extern UIP_USER udp_server; //UDP server数据结构
extern u16 UDP_ServerPort; //UDPserver本地port void udp_server_connected(u16 ServerPort,u16 ClientPort); //建立一个UDPserver(广播方式)
void udp_server_appcall(void); //server回调函数,用于uip处理数据
void udp_ServerSendDataPackage(u8 *pBuff, u16 len,u16 ClientPort); //UDP server发送数据
void udp_ServerSendEndCallBack(u16 conn); //UDP发送数据完毕回调函数 #endif //_UDP_SERVER_H_
//结构体定义
//用户连接数据结构
#define UIP_RX_BUFF_ZISE 512 //接收数据缓冲区大小
#define UIP_TX_BUFF_ZISE 512 //发送数据缓冲区大小
typedef struct
{
u16 RxLen; //接收数据长度
u16 TxLen; //发送数据长度
u16 ClientPort; //clientport
u16 ServerPort; //serverport
u8 RxBuff[UIP_RX_BUFF_ZISE]; //接收缓冲区
u8 TxBuff[UIP_TX_BUFF_ZISE]; //接收缓冲区
}UIP_USER;
//配置定义
#define DHCP_TIME_OUT 60 //DHCP获取超时时间,单位S
#define TCP_LINK_SERVER_TIME_OUT 10 //连接server超时时间,单位S
#define TCP_LINK_SERVER_CNT 5 //连接server重试次数
#define TCP_CLIENT_PORT_AUTO 1 //clientport随机分配
#define TCP_CLIENT_DEFAULT_PORT 2400 //client默认port
#define TCP_SERVER_DEFAULT_IP 192,168,16,104 //server默认IP地址
#define TCP_SERVER_DEFAULT_PORT 8888 //server默认port
#define TCP_SEND_TIME_OUT 5 //数据发送超时时间,单位S #define UDP_LOCAL_PORT 8000 //UDP连接本地port
#define UDP_REMOTE_PORT 8899 //UDP连接远程port
#define UDP_SERVER_PORT 8100 //UDPserver本地port
//数据port调度
//UDP应用接口函数(UIP_UDP_APPCALL)
void udp_appcall(void)
{ switch(uip_udp_conn->lport)//本地监听端口
{
//用于DHCP
case HTONS(67): dhcpc_appcall();break;
case HTONS(68): dhcpc_appcall();break;
default:
{
if(uip_udp_conn->lport == HTONS(UDP_ClinetPort)) //UDP客户端
{
udp_client_appcall();
}
else if(uip_udp_conn->lport == HTONS(UDP_ServerPort)) //UDP服务器
{
udp_server_appcall();
}
}break;
}
}
//UDP调度处理,必须在数据发送完毕后调用自己定义的回调函数
for(i = 0; i < UIP_UDP_CONNS; i++)
{
//仅仅处理发送事件
uip_udp_periodic(i); //处理UDP通信事件
//当上面的函数运行后。假设须要发送数据,则全局变量uip_len>0
//须要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
if(uip_len > 0)
{
LED2 = ~ LED2;
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
tapdev_send();//发送数据到以太网
udp_ServerSendEndCallBack(i); //数据发送完毕后一定要调用回调函数
break;
}
}
调用这个实现将clientport设置为0,这样就能够接受来自随意port的数据
udp_ServerSendEndCallBack(i); //数据发送完毕后一定要调用回调函数
//初始化并处理UDPserver数据
//实现收到后马上返回数据
udp_server_connected(UDP_SERVER_PORT, 0); //新建UDP服务器,client随意port
//UDP服务器数据处理
if(udp_server.RxLen > 0)
{ uart_printf("服务器port:%d\r\n",udp_server.ServerPort);
uart_printf("clientport:%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 UDP server广播模式(client能够随意port,而且主动向client发送数据)的更多相关文章
- TCP/UDP server
Simple: Sample TCP/UDP server https://msdn.microsoft.com/en-us/library/aa231754(v=vs.60).aspx Simple ...
- 五十八、linux 编程——UDP 编程 广播
58.1 广播介绍 58.1.1 介绍 广播实现一对多的通讯 它通过向广播地址发送数据报文实现的 58.1.2 套接字选项 套接字选项用于修饰套接字以及其底层通讯协议的各种行为.函数 setsocko ...
- TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。
一.TCP通信测试: 1) 创建TCP Server: 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框 输入监听端口后,即创建了一个在指定端口上进行监听的TCP S ...
- UDP client,UDP server, TCP server, TCP client
UDP server import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocke ...
- 使用epoll实现一个udp server && client
udp server #!/usr/bin/env python #-*- coding:utf-8 -*- import socket import select import Queue #创建s ...
- uip UDPclient模式通信移植,当地port随机
现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************ ...
- iOS 利用Socket UDP协议广播机制的实现
1.前言 什么是UDP协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...
- Linux网络编程四、UDP,广播和组播
一.UDP UDP:是一个支持无连接的传输协议,全称是用户数据包协议(User Datagram Protocol).UDP协议无需像TCP一样要建立连接后才能发送封装的IP数据报,也是因此UDP相较 ...
- epoll简介 与 UDP server的实现
Abstractepoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系 ...
随机推荐
- Docker中免去sudo的设置方法
Add the docker group if it doesn't already exist: sudo groupadd docker Add the connected user " ...
- [USACO4.2]完美的牛栏The Perfect Stall
题目:USACO Training 4.2(在官网上提交需加文件输入输出).洛谷P1894. 题目大意:有n头奶牛m个牛栏,每头牛只会在自己喜欢的牛栏里产奶,问一次最多有多少奶牛能产奶. 解题思路:二 ...
- PageUtil
package cn.com.qmhd.oto.common; import java.io.Serializable; import java.util.List; import org.sprin ...
- 查看centos7启动项
[root@k8s-master ~]# chkconfig Note: This output shows SysV services only and does not include nativ ...
- 【codeforces 417D】Cunning Gena
[题目链接]:http://codeforces.com/problemset/problem/417/D [题意] 有n个人共同完成m个任务; 每个人有可以完成的任务集(不一定所有任务都能完成); ...
- HDU 3046 Pleasant sheep and big big wolf
Pleasant sheep and big big wolf Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged ...
- Qt之自定义布局管理器(QFlowLayout)
简述 QFlowLayout,顾名思义-流布局,实现了处理不同窗口大小的布局.根据应用窗口的宽度来进行控件放置的变化. 具体实现要求不再赘述,请参考前两节内容. 简述 实现 效果 源码 实现 QFlo ...
- XCL-Chart柱形图的期望线/分界线
周日在柱形图上加了两个小功能,当中之中的一个是加上了期望线/分界线,功能非常小,但我个人非常喜欢这个功能(好像之前也没看到别的图表库原生支持这个. ) 主要是加上这些小小的横线后,能非常明显的区分出数 ...
- cocos2d-x-3.2 怎样创建新project
1.在cocos2d-x-3.2\执行python命令 python setup.py //它的作用是将以下这些路径加入到你的用户环境变量中,当然你也能够不加入 COCOS_CONSOLE_ROOT ...
- 从client(content="<p></p>")中检測到有潜在危急的 Request.Form 值。
最近的站点要做一个新闻模块,站点后台须要对新闻进行管理,拿到富文本编辑器的内容,在获取的时候会报一个错误:从client(content="<p>.....</p>& ...