uip协议,主动发送功能

本文详细介绍了UIP协议作为服务器及客户端的应用方式。当作为服务器时,通过不断读取网卡数据并处理,再将结果返回给客户端;而作为客户端,则需要主动发送数据包,文章给出了具体的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值