我从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() successfuln");
        } else {
         printf("Error has occurred: %dn", 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;
}

我认为您的问题是由于没有调用tftpModeSet-http://www.vxdev.com/docs/vx55man/vxworks/ref/tftpLib.html#tftpModeSet

因此添加:

tftpModeSet(pTftpDesc, "binary");

这将防止您的二进制文件导致流在第一个n 上消亡

好吧,事实证明TFTP在我的情况下是不可行的。我连接了Wireshark,看到我的客户端在端口69上很好地连接到了服务器。我之前还确保在iptable规则中正确设置了端口69上的端口转发。现在我刚在维基百科上读到这篇文章:

数据传输在端口69上启动,但数据传输端口由发送方和接收方在初始化期间独立选择连接的。端口是根据网络堆栈的参数,通常在临时端口

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

我发现标准的VxWorks库也包含ftpLib.h(http://www.vxdev.com/docs/vx55man/vxworks/ref/ftpLib.html#ftpLs)这将有望解决我的NAT问题,因为FTP使用基于连接的TCP。

相关内容

  • 没有找到相关文章

最新更新