我在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。