uIP主动发送数据的方法

来源:互联网 发布:中国2016年gdp数据 编辑:程序博客网 时间:2024/04/28 05:49
一下来自 http://www.amobbs.com/thread-4041588-1-1.html
本文基于 uIP 0.9

    在 uIP中,主动发送数据有两个方法。

    一种是用uip_input:当检测到新的数据时,调用uip_input(),把接收到的IP包解包,然后提取出用户数据,然后调用app_call,在app_call中调用uip_send()或者uip_udp_send()来发送数据。

    另一种是用uip_periodic(),即在主循环超时仍没有接收到新数据时,调用 uip_periodic(),像uip_input那样在其里面调用app_call,再调用uip_send()或者uip_udp_send()来发送数据。

    在这里提示一下,uip_input()与uip_periodic()其实是同一个函数,他们的本体是uip_process();一个作用是对IP包进行解包,并提取出用户数据,另一个作用是对用户的数据进行打包,使之符合IP包格式,等待发送。所以,uip_process()里面会调用app_call(),让用户包把数据从appdata取出,或者把要发送的数据填进去 (sappdata)。

    好了,我想说的就是,当有新数据时,会调用uip_input,以及 app_call,在app_call中用户得到appdate里面的数据,对之进行处理或者执行其他命令,之后如果要反馈信息,则紧接着使用 uip_send来把数据填进appdate(sappdate),当uip_input返回后,就会调用nic_send(底层网卡 (enc28j60,RTL8019之类)的驱动函数)来把发送缓冲里面已经封装好的的整个IP包发送出去。

    当你要发送的数据小于一个IP包的大小时(大小可用 UIP_BUFSIZE 指定,最大不超过1500),是没问题的。数据会完整的通过网路发送。当你要发送的文件超过IP包的大小时,就要分包发送,就是把一段数据分成几个IP包发送。


以下请教大家一个问题。
----------------------------------------------------------------------------------------------------

    问题是,怎么分包发送?uIP 完全没有提供这个应用接口,它只提供把数据填进appdate的方法,那如果要发的数据大于appdate呢?当uip_input返回时,就把appdate里所能容纳的数据用nic_send发送出去了,当再来新数据时,才会再次调用uip_input。换句话说,就是没有新数据,uip_input就不会被调用。当然上位机可以不断地发数据来命令下位机的uIP来发送剩下未完的数据,但是这样就要对上位机进行改造,不能用通用的 TCP/IP 调试软件来调试程序。而且这样做的效率也十分低下。

    另一个方法是使用uip_periodic()来发送,但是uip_periodic()属于一个周期函数,半秒钟才调用一次,那如果要发一个几MB的数据,半秒钟才发1000多字节,要发送到何年何月,尽管这个半秒钟可以设置成更短,但是这会干扰到uIP对TCP超时,以及ARP包超时的检测,也会极大的增加下位机的负担。这个函数实在不适合用在这里。

    有人可能会说,直接在app_call()里面使用uip_periodic(),然后再使用nic_send(),就可以立即把数据发送出去,但是调试uip_periodic()时,又会在其里面调用app_call(),这样调结构就变成 app_call() --> uip_periodic() --> app_call() 函数就重载(是这样叫吗?还是叫重入?)了。下位机最好避免出现这种重载吧。

    我的需求是,通过网络发送一个命令给下位机,然后下位机把SD卡里面的一个文件通过网路传送回上位机,这个文件肯定是大于1500字节,所以需要分包发送,请问大家有什么好的解决方案吗?先谢谢大家。

    估计写的比较乱,大家将就一下啦,同时,本文前几段阐述了uIP的一些工作流程,希望对一些刚接触uIP的同学有帮助。

原创粉丝点击