我从vxworks获得tftp超时

时间:2013-12-05 19:53:23

标签: timeout vxworks tftp

我在VxWorks上编写了一些代码,使用tftpLib从TFTP服务器下载文件,但是get给了我一个超时:

ERR [TFTP] tftpSend:479: Transfer Timed Out.
ERR [TFTP] tftpGet:1077: File transfer error.
Error has occurred: 4915207

这是不正确的,因为主机可以访问:

ping("3.94.213.53",3)

Pinging 3.94.213.53 (3.94.213.53) with 64 bytes of data:
Reply from 3.94.213.53 bytes=64 ttl=63 seq=0 time<1ms
Reply from 3.94.213.53 bytes=64 ttl=63 seq=1 time<1ms
Reply from 3.94.213.53 bytes=64 ttl=63 seq=2 time<1ms

当我从Linux shell执行此操作时,它的工作方式与预期一致:

tftp -r "artifacts/ngfm.bin" -g 3.94.213.53

这可能是什么问题? 我的代码的get部分如下所示:

pFile = fopen("flash:/ngfm.bin","wb");
    if (pFile != NULL) {
        /* Get file from TFTP server and write it to the file descriptor */
        if (OK == (status = tftpGet (pTftpDesc, pFilename, pFile, TFTP_CLIENT))) {
         printf("tftpGet() successful\n");
        } else {
         printf("Error has occurred: %d\n", errno); // errno is where the error is stored
        }
    } else {
        printf("Bad file pointer pFile");
    }

修改

我在get部分上面的代码是:

/*Initiate TFTP session*/
if ((pTftpDesc = tftpInit ()) == NULL)
   printf("Error on tftpInit()\n");

/*connect to TFTP host and set transfer mode*/
if ((tftpPeerSet (pTftpDesc, pHost, port) == ERROR) ||
    (tftpModeSet (pTftpDesc, pMode) == ERROR)) {
    (void) tftpQuit (pTftpDesc);
    printf("Error on tftpPeerSet()\n");
    return ERROR;
}

2 个答案:

答案 0 :(得分:1)

我认为您的问题是由于缺少对tftpModeSet - http://www.vxdev.com/docs/vx55man/vxworks/ref/tftpLib.html#tftpModeSet

的调用造成的

添加:

tftpModeSet(pTftpDesc, "binary");

这将阻止您的二进制文件在第一个\n

上导致流消失

答案 1 :(得分:0)

好的,事实证明TFTP在我的情况下是不行的。 我联系了Wireshark,看到我的客户端正好通过端口69进入服务器。我以前也确保在我的iptable规则中正确地在端口69设置端口转发。现在我在维基百科上看到这个:

  

数据传输在端口69上启动,但数据传输端口是   在初始化期间由发送方和接收方独立选择   连接。端口是根据随机选择的   网络堆栈的参数,通常来自的范围   短暂的港口

即。 TFTP对我不起作用,因为我需要NAT并且必须是安全的。我需要使用一个以orriented为连接的协议,例如ftp。

我发现标准VxWorks库还包含ftpLib.hhttp://www.vxdev.com/docs/vx55man/vxworks/ref/ftpLib.html#ftpLs),当FTP与基于连接的TCP一起使用时,它有望解决我的NAT问题。