可以看看uip.h。里面有使用函数的说明和例程。
uip_polling在main-while 中调用
check(uip_len>0 ) 有网络数据后,处理事件。uip_polling定义了这些功能,uip才会有相应的功能。
处理哪些事件。如
UIP_ETHTYPE_IP \ /-> udp_app 用户程序
UIP_ETHTYPE_ARP |--uip_process核心调用处理---|->tcp_app
定时检测UDP/TCP通讯事件 | |->tcp连接处理
uip_udp_periodic/轮询用户app / \->数据录入
初始化
void udp_app_init(void)
{
uip_ipaddr_t addr;
struct uip_udp_conn *c;
uip_ipaddr(&addr, 192,168,0,132);
c = uip_udp_new(&addr, HTONS(UDP_TEST_PORT)); //remote port
if(c != NULL) {
uip_udp_bind(c, HTONS(UDP_TEST_PORT)); //local port
}
}
------------------------------------------------------------------------------------
void udp_appcall(void)
{
switch(uip_udp_conn->lport)
{
case HTONS(UDP_TEST_PORT):
udp_test_app(uip_appdata);
break;
default:
break;
}
}
uip里有很多全局变量,用起来有点头大。有时根本不知道他用来干嘛的,几个差不多的变量经常搞混
例如:
1网口的接口代码,也是用的uip_len和uip_buf这种全局变量
void tapdev_send(void)
{
ENC28J60_Packet_Send(uip_len,uip_buf);
}
2 检查网络事件
if(uip_len>0)
代码风格也不怎么好
uip_process里还很多goto
if(flag == UIP_UDP_SEND_CONN) {
goto udp_send;
}
只能单工模式:发送和接收数据共用一个buff,在接收函数里甚至不能回送接收信息
官方例程unix节选
unsigned int
tapdev_read(void)
{
int ret;
ret = read(fd, uip_buf, UIP_BUFSIZE);
return ret;
}
/*---------------------------------------------------------------------------*/
void tapdev_send(void)
{
int ret;
ret = write(fd, uip_buf, uip_len);
}
void udp_receive_app(char * p)
{
if(uip_newdata())
{
memcpy((char *)udp_send_databuf,uip_appdata,UIP_APPDATA_SIZE);
uip_send(udp_send_databuf,UIP_APPDATA_SIZE);
}
}
这样数据是不会发送出来的,而且发送几条后uip就会停止udp服务
只要不动uip_appdata,这样是可以的(原因我也不清楚,很纳闷,uip还是)
void udp_test_app(char * p)
{
if(uip_newdata())
{
strcpy((char *)udp_send_databuf,"good news \n");
uip_send(udp_send_databuf,11);
//或者直接 uip_send("good news \n",11);
}
}
UDP的接收app里,没有特殊处理,只能发送一条数据。
因为uip_send()只是把数据放入buf,然后通过在uip_polling()中轮询发送。所以连续多条uip_send()时只发送最后那条。如
uip_send("this is a good news! \n",22);
uip_send("this is a bad news! \n",21);
就只发送后面一条
uip_polling()
放在main主循环里的用户函数,通过不同事件调用uip_process()
uip_process()
uip_process()都是通过类似定义来引用
#define uip_input() uip_process(UIP_DATA)
uip_polling都是通过以下函数来引用uip_process(),包括
uip_input() 接收包处理
uip_periodic(conn) TCP连接周期性处理
uip_periodic_conn(conn) 制定TCP连接处理
uip_poll_conn(conn) 轮询特定连接
uip_udp_periodic(conn) UDP周期性处理
uip_udp_periodic_conn(conn) 特定UDP周期性处理