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的同学有帮助。
本文基于 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的同学有帮助。
- uIP主动发送数据的方法
- 单片机之UIP--TCP作为服务器,主动发送数据 ACK
- 关于UIp通讯自己主动发送的办法
- C# socket主动给指定客户端发送数据的方法
- uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)
- uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)
- UIP协议栈UDP数据发送的问题
- mina 服务端主动发送的一种方法
- PHP主动发送与被动接收xml数据
- PHP主动发送与被动接收xml数据褂
- PHP主动发送与被动接收xml数据蹲
- PHP主动发送与被动接收xml数据戎
- PHP主动发送与被动接收xml数据凰
- comet技术(后台主动向前台发送数据…
- zabbix-sender主动发送数据给zabbix-server
- H5Server Sent Event服务端主动发送数据回客户端
- 海思音频解码采用主动获取解码通道数据发送到音频输出通道时出现的问题
- 网络发送数据块的方法
- [互联网面试笔试汇总C/C++-15] 判断一棵二叉树是否是完全搜索树-微策略
- cocos2d-x 贪吃蛇例子 附demo
- android ListView的上部下拉刷新下部点击加载更多具体实现及拓展
- Interface例子
- Mina client客户端编写
- uIP主动发送数据的方法
- 虚拟机问题 vmware workstation无法恢复错误:(vmui)
- 探究streambuf
- 暂时规规矩矩用C
- leetcode:Permutations II (序列所有无重复排列)【面试算法题】
- 20个经典Android游戏源码下载地址(持续更新~)
- iPhone UITableViewCell如何滚动到视图顶端
- 深入理解TCP/IP协议栈之TCP协议
- asp.net实现点登录