how to 实现基于lwip的tftp ?

[复制链接]
5044|2
 楼主| linnaldf 发表于 2008-12-8 21:14 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;我想做一个lwip测试程序,同时实现TFTP客户端和服务器端,从PC下载一个文件,然后再上传给PC,来测试lwip的性能。<br />&nbsp;&nbsp;&nbsp;&nbsp;上网找的tftp程序要么是基于windows系统的,要么是linux系统的,依赖性很强,要找到用于嵌入式,并且是基于lwip协议栈的tftp程序还真难找,自己也没有这方面的编程经验。<br />&nbsp;&nbsp;&nbsp;&nbsp;有经验的请多指导!<br />&nbsp;&nbsp;&nbsp;&nbsp;十分感谢!O(∩_∩)O
armecos 发表于 2008-12-8 21:54 | 显示全部楼层

测试lwip性能不需要tftp,

你直接编写一个UDP/TCP程序和PC机通信,让PC机发送几百兆数据给设备,设备直接抛弃数据,在PC侧统计用时,用数据量/时间就是速率了,比TFTP统计还准。而且可以测试多线程下载,打开多条链路,看看多线程对协议栈传输的影响。<br /><br />《ecos增值包》也中有TFTP源码,硬件无关。<br /><br />这是《ecos增值包》中PC上位机的测试范例:<br /><br />//此程序配合开发板webserver.c调试<br /><br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&quot;winsock2.h&quot;<br />#include&nbsp;&quot;windows.h&quot;<br /><br />void&nbsp;main()&nbsp;{<br /><br />&nbsp;&nbsp;//----------------------<br />&nbsp;&nbsp;//&nbsp;Initialize&nbsp;Winsock.<br />&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br />&nbsp;&nbsp;SOCKET&nbsp;ConnectSocket;<br />&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;clientService;&nbsp;&nbsp;<br />&nbsp;&nbsp;int&nbsp;bytesSent,numread,filesize;<br />&nbsp;&nbsp;DWORD&nbsp;dwStart,dwEnd;<br />&nbsp;&nbsp;double&nbsp;delta,rate;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;sendbuf[1];<br /><br />&nbsp;&nbsp;FILE&nbsp;*fp;<br /><br />&nbsp;&nbsp;int&nbsp;iResult&nbsp;=&nbsp;WSAStartup(MAKEWORD(2,2),&nbsp;&wsaData);<br /><br />&nbsp;&nbsp;if(&nbsp;(fp&nbsp;=&nbsp;fopen(&nbsp;&quot;c:y.pdf&quot;,&nbsp;&quot;rb&quot;&nbsp;))&nbsp;==&nbsp;NULL&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Problem&nbsp;opening&nbsp;the&nbsp;file
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;filesize&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;if&nbsp;(iResult&nbsp;!=&nbsp;NO_ERROR)<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Error&nbsp;at&nbsp;WSAStartup()
&quot;);<br /><br />&nbsp;&nbsp;//----------------------<br />&nbsp;&nbsp;//&nbsp;Create&nbsp;a&nbsp;SOCKET&nbsp;for&nbsp;connecting&nbsp;to&nbsp;server<br />&nbsp;&nbsp;ConnectSocket&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;IPPROTO_TCP);<br />&nbsp;&nbsp;if&nbsp;(ConnectSocket&nbsp;==&nbsp;INVALID_SOCKET)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Error&nbsp;at&nbsp;socket():&nbsp;%ld
&quot;,&nbsp;WSAGetLastError());<br />&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;//----------------------<br />&nbsp;&nbsp;//&nbsp;The&nbsp;sockaddr_in&nbsp;structure&nbsp;specifies&nbsp;the&nbsp;address&nbsp;family,<br />&nbsp;&nbsp;//&nbsp;IP&nbsp;address,&nbsp;and&nbsp;port&nbsp;of&nbsp;the&nbsp;server&nbsp;to&nbsp;be&nbsp;connected&nbsp;to.<br />&nbsp;&nbsp;clientService.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;clientService.sin_addr.s_addr&nbsp;=&nbsp;inet_addr(&nbsp;&quot;192.168.0.6&quot;&nbsp;);<br />&nbsp;&nbsp;clientService.sin_port&nbsp;=&nbsp;ntohs(&nbsp;2280&nbsp;);//2280&nbsp;for&nbsp;1&nbsp;channel&nbsp;tcp&nbsp;test&nbsp;;&nbsp;2290&nbsp;for&nbsp;multi&nbsp;tcp&nbsp;test<br /><br />&nbsp;&nbsp;//----------------------<br />&nbsp;&nbsp;//&nbsp;Connect&nbsp;to&nbsp;server.<br />&nbsp;&nbsp;if&nbsp;(&nbsp;connect(&nbsp;ConnectSocket,&nbsp;(SOCKADDR*)&nbsp;&clientService,&nbsp;sizeof(clientService)&nbsp;)&nbsp;==&nbsp;SOCKET_ERROR)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;&quot;Failed&nbsp;to&nbsp;connect.
&quot;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;dwStart&nbsp;=&nbsp;GetTickCount();<br />&nbsp;&nbsp;while(&nbsp;!feof(&nbsp;fp&nbsp;)&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numread&nbsp;=&nbsp;fread(&nbsp;sendbuf,&nbsp;sizeof(&nbsp;char&nbsp;),&nbsp;sizeof(sendbuf),&nbsp;fp&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;ferror(&nbsp;fp&nbsp;)&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&nbsp;&quot;Read&nbsp;error&quot;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytesSent&nbsp;=&nbsp;send(&nbsp;ConnectSocket,&nbsp;sendbuf,&nbsp;numread,&nbsp;0&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesize&nbsp;=&nbsp;filesize&nbsp;+&nbsp;numread;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;dwEnd&nbsp;=&nbsp;GetTickCount();<br /><br />&nbsp;&nbsp;delta&nbsp;=&nbsp;(dwEnd&nbsp;-&nbsp;dwStart)&nbsp;/&nbsp;1000.0;<br />&nbsp;&nbsp;if(delta&nbsp;&lt&nbsp;1E-6&nbsp;&&&nbsp;delta&nbsp;&gt=&nbsp;0.0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rate&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rate&nbsp;=&nbsp;filesize&nbsp;*&nbsp;8&nbsp;/&nbsp;1000.0&nbsp;/&nbsp;delta;<br />&nbsp;&nbsp;printf(&quot;File&nbsp;size=%d(bytes)&nbsp;,&nbsp;trans&nbsp;time=%lf(s)&nbsp;,&nbsp;trans&nbsp;rate=%lf(Kbps)
&quot;,filesize,delta,rate);<br /><br />&nbsp;&nbsp;printf(&quot;Press&nbsp;any&nbsp;key&nbsp;to&nbsp;continue...
&quot;);<br />&nbsp;&nbsp;getchar();<br /><br />&nbsp;&nbsp;WSACleanup();<br />&nbsp;&nbsp;fclose(fp);<br />&nbsp;&nbsp;return;<br />}<br /><br /><b><font color=#FF0000>上述文档可能不完整或已被更新,想获得该资料的最新最全版本,请访问:</font>www.armecos.com</b><br /><br /><b>更多内容,详见:</b><br /><b>我的培训中心</b><br /><b>我的研发团队</b><br /><b>我的技术顾问</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>文件系统整体解决方案咨询套餐</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>IP协议栈整体解决方案咨询套餐</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>USB整体解决方案咨询套餐</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>BootLoader整体解决方案咨询套餐</b><br />
dld2 发表于 2008-12-9 08:12 | 显示全部楼层

学习

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部