uip之udp程序参考

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件

*******************************************************************************/

相关文档
最新文档