一、uip协议,作为服务器
一般情况下,在uip协议作为服务器使用,在while(1)中实现以下代码,不断读取网卡数据,进行处理,然后返回给客户端。
////////////////////////////////////////////////////
uip_len = tapdev_read((void *)uip_buf);
if(uip_len > 0) /* received packet */
{
if(BUF->type == htons(UIP_ETHTYPE_IP)) /* IP packet */
{
uip_input();
if(uip_len > 0)
{
uip_arp_out();
tapdev_send((void *)uip_buf,uip_len);
clear_udp_ports();
}
}
else if(BUF->type == htons(UIP_ETHTYPE_ARP)) /*ARP packet */
{
//printf("Recv a ARP packet\r\n");
uip_arp_arpin();
if(uip_len > 0)
{
tapdev_send((void *)uip_buf,uip_len); /* ARP ack*/
}
}
}
else if(timer_expired(&periodic_timer)) /* no packet but periodic_timer time out (0.5s)*/
{
timer_reset(&periodic_timer);
for(i = 0; i < UIP_CONNS; i++)
{
uip_periodic(i);
if(uip_len > 0)
{
uip_arp_out();
tapdev_send((void *)uip_buf,uip_len);
}
}
#if UIP_UDP
for(i = 0; i < UIP_UDP_CONNS; i++)
{
uip_udp_periodic(i);
if(uip_len > 0)
{
uip_arp_out();
tapdev_send((void *)uip_buf,uip_len);
}
}
#endif /* UIP_UDP */
/* Call the ARP timer function every 10 seconds. */
if(timer_expired(&arp_timer))
{
timer_reset(&arp_timer);
uip_arp_timer();
}
}
二、uip协议,作为客户端,主动发送
在网上搜寻了以下,有的利用超时处理,有的加快服务器响应时间来发送,并没有实现利用uip协议主动发送功能,也就是作为客户端。仔细看了以下uip处理消息的流程,无非就是收到buf,分解,提取远端ip,端口,填充buf等操作,要想实现主动发送,必须自己完成后半部分工作,然后利用 网卡直接发送。主要思路如下:
1、设置远端IP,端口
2、从ARP列表寻找MAC
3、填充BUF
4、网卡发送
5、Demo链接
https://download.youkuaiyun.com/download/qq_18322543/10458634