打印

how to 实现基于lwip的tftp ?

[复制链接]
3931|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linnaldf|  楼主 | 2008-12-8 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我想做一个lwip测试程序,同时实现TFTP客户端和服务器端,从PC下载一个文件,然后再上传给PC,来测试lwip的性能。
    上网找的tftp程序要么是基于windows系统的,要么是linux系统的,依赖性很强,要找到用于嵌入式,并且是基于lwip协议栈的tftp程序还真难找,自己也没有这方面的编程经验。
    有经验的请多指导!
    十分感谢!O(∩_∩)O

相关帖子

沙发
armecos| | 2008-12-8 21:54 | 只看该作者

测试lwip性能不需要tftp,

你直接编写一个UDP/TCP程序和PC机通信,让PC机发送几百兆数据给设备,设备直接抛弃数据,在PC侧统计用时,用数据量/时间就是速率了,比TFTP统计还准。而且可以测试多线程下载,打开多条链路,看看多线程对协议栈传输的影响。

《ecos增值包》也中有TFTP源码,硬件无关。

这是《ecos增值包》中PC上位机的测试范例:

//此程序配合开发板webserver.c调试

#include <stdio.h>
#include "winsock2.h"
#include "windows.h"

void main() {

  //----------------------
  // Initialize Winsock.
  WSADATA wsaData;
  SOCKET ConnectSocket;
  struct sockaddr_in clientService;  
  int bytesSent,numread,filesize;
  DWORD dwStart,dwEnd;
  double delta,rate;
  unsigned char sendbuf[1];

  FILE *fp;

  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

  if( (fp = fopen( "c:y.pdf", "rb" )) == NULL ){
      printf("Problem opening the file ");
      return;
  }

  filesize = 0;

  if (iResult != NO_ERROR)
    printf("Error at WSAStartup() ");

  //----------------------
  // Create a SOCKET for connecting to server
  ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (ConnectSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld ", WSAGetLastError());
    WSACleanup();
    return;
  }

  //----------------------
  // The sockaddr_in structure specifies the address family,
  // IP address, and port of the server to be connected to.
  clientService.sin_family = AF_INET;
  clientService.sin_addr.s_addr = inet_addr( "192.168.0.6" );
  clientService.sin_port = ntohs( 2280 );//2280 for 1 channel tcp test ; 2290 for multi tcp test

  //----------------------
  // Connect to server.
  if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    printf( "Failed to connect. " );
    WSACleanup();
    return;
  }

  dwStart = GetTickCount();
  while( !feof( fp ) ){
      numread = fread( sendbuf, sizeof( char ), sizeof(sendbuf), fp );
      if( ferror( fp ) )      {
         perror( "Read error" );
         break;
      }
      bytesSent = send( ConnectSocket, sendbuf, numread, 0 );
      filesize = filesize + numread;
  }
  dwEnd = GetTickCount();

  delta = (dwEnd - dwStart) / 1000.0;
  if(delta < 1E-6 && delta >= 0.0)
      rate = 0;
  else
      rate = filesize * 8 / 1000.0 / delta;
  printf("File size=%d(bytes) , trans time=%lf(s) , trans rate=%lf(Kbps) ",filesize,delta,rate);

  printf("Press any key to continue... ");
  getchar();

  WSACleanup();
  fclose(fp);
  return;
}

上述文档可能不完整或已被更新,想获得该资料的最新最全版本,请访问:www.armecos.com

更多内容,详见:
我的培训中心
我的研发团队
我的技术顾问
    文件系统整体解决方案咨询套餐
    IP协议栈整体解决方案咨询套餐
    USB整体解决方案咨询套餐
    BootLoader整体解决方案咨询套餐

使用特权

评论回复
板凳
dld2| | 2008-12-9 08:12 | 只看该作者

学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

粉丝