我在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;
}
答案 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.h
(http://www.vxdev.com/docs/vx55man/vxworks/ref/ftpLib.html#ftpLs),当FTP与基于连接的TCP一起使用时,它有望解决我的NAT问题。