uip之udp程序参考
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、UDP的移植
a> uipopt.h 中修改
#define UIP_UDP 1
#define UIP_UDP_CONNS 10(同时可建立udp的连接数)
#define UIP_UDP_APPCALL udp_appcall (UDP的用户接口函数)
添加#include
b> 新建udp.c 和udp.h 两个文件
udp.c中定义两个函数
udpinit(void)
{
uip_ipaddr(ipaddr, RIPADDR0, RIPADDR1, RIPADDR2, RIPADDR3);
uip_udp_new(ipaddr, UDP_LPORT, UDP_RPORT);
//建立一个udp,指定udp端口。
//注意:我对uip_udp_new()函数做了修改,原来本地端口是随机的,我改为了可以配置的。
}
//当UDP数据被tapdev_read ()收到,uip_process()函数对UDP进行解析,如果正确,则调用udp_appcall()来交给用户处理。此时,用户可以用uip_newdata()检测是否有新数据,新数据放在uip_appdata指针中,长度为uip_len。
//当定时轮询到达,后也会调用udp_appcall(),可以用uip_poll()检查。此时,用户可以主动发送数据。只须将数据放入指针uip_appdata后的空间中,并将数据长度传给
uip_slen便可。
下面给出了函数的模型(仅供参考):
void udp_appcall(void)
{
if(uip_udp_conn->rport == HTONS(UDP_RPORT))
{
if(uip_poll())
{
/*
for(u16_t i=0; i<1000; i++)
{
*(uip_appdata++) = (u8_t)i;
}
*uip_appdata = '\0';
uip_slen = 1000; //strlen((char*)uip_appdata);*/
}
if(uip_newdata())
{
uip_appdata[uip_len]='\0';
uip_slen = uip_len;
}
}
}
static struct uip_udp_conn *conn_tftp=NULL;
u16_t any[2];
//远程IP为192.168.1.200
uip_ipaddr(any, 192, 168, 1, 200);
if(conn_tftp != NULL)
{
uip_udp_remove(conn_tftp);//如果连接已经建立,则删除之
}
conn_tftp = uip_udp_new(any, HTONS(1000)); //建立到远程ipaddr,端口为1000的连接if(conn_tftp != NULL)
{
//绑定本地端口为1000
conn_tftp->lport = HTONS(1000);
}
void myudp_appcall(void)
{
if(myudp_conn->rport == HTONS(1000))
{
/*if(uip_poll()) {
myudp_send("hello\n",6);//定时时间到,发hello
}*/
if(uip_newdata()) //如果指定IP的指定端口发来数据
{
newdata();
}
}
}
/*******************************************************************************
* 函数名: udp_app_init
* 输入: 无
* 输出: 无
* 功能说明:设置需要监听的UDP端口,这个函数在uip_init() 以后调用。
*******************************************************************************/ void udp_app_init(void)
{
//服务器
/* 开始监听UDP端口LPORT */
//uip_listen(HTONS(LPORT));
uip_listen(HTONS(g_NetPara.udpserverport));
uip_udp_bind(&uip_udp_conns[0], HTONS(g_NetPara.udpserverport));
//客户端
uip_ipaddr_t addr;
struct uip_udp_conn *c;
uip_ipaddr(addr,g_NetPara.udpdstipaddr[0],g_NetPara.udpdstipaddr[1],g_NetPara.udpdstipaddr[2],g_N etPara.udpdstipaddr[3]);
c = uip_udp_new(&addr, HTONS(g_NetPara.udpdstport));
if(c != NULL) {
uip_udp_bind(c, HTONS(1999));
}
tcpudp_sendlen = 0;
tcpudp_sendflag = 0;
}
/*******************************************************************************
* 函数名: udp_app_call
* 输入: 无
* 输出: 无
* 功能说明:这是一个回调函数
在h文件中,我们定义UIP_UDP_APPCALL的宏等于udp_app_call
* 当uip事件发生时,UIP_UDP_APPCALL函数会被调用。
* 例如: 当一个UDP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件
*******************************************************************************/