я получаю тайм-аут tftp от vxworks

Я написал на VxWorks некоторый код для загрузки файла с TFTP-сервера с использованием tftpLib, но 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, все работает так, как и ожидалось:

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");
    }

изменить:

Код, который у меня есть над частью получения:

/*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;
}

person stdcerr    schedule 05.12.2013    source источник
comment
Пожалуйста, проголосуйте за ответ, который я дал вам на другой вопрос :)   -  person Noam Rathaus    schedule 06.12.2013
comment
Можно поставить wireshark (или любой другой сниффер пакетов) и смотреть в поток данных?   -  person Noam Rathaus    schedule 06.12.2013
comment
Да, я сейчас подключил Wire Shark и вижу минимальную разницу. Со стороны VxWorks я вижу такие вещи, как «Порт недоступен», который мне нужно изучить, за исключением того, что разница между строкой инициализации в Linux и VxWorks минимальна: Linux 7263 579.036996 3.94.213.214 3.94.213.53 TFTP 77 Read Request, File: artifacts/ngfm.bin, Transfer type: octet, tsize\000=0\000 против VxWorks: 81921 748.913374 3.94.213.214 3.94.213.53 TFTP 69 Read Request, File: artifacts/ngfm.bin, Transfer type: octet   -  person stdcerr    schedule 06.12.2013
comment
tsize должно быть больше 0, так как это общий размер. Можете ли вы вставить передачу TFTP в свой OP? просто скопируйте описание TFTP пакета (щелкните правой кнопкой мыши строку TFTP и выберите «Описание»)   -  person Noam Rathaus    schedule 06.12.2013


Ответы (2)


Я считаю, что ваша проблема вызвана отсутствием вызова tftpModeSet - http://www.vxdev.com/docs/vx55man/vxworks/ref/tftpLib.html#tftpModeSet

Итак, добавьте:

tftpModeSet(pTftpDesc, "binary");

Это предотвратит отключение потока из-за вашего бинарного файла в первый \n

person Noam Rathaus    schedule 05.12.2013
comment
Я делаю это, но перед получением части моего кода см. редактирование выше - person stdcerr; 06.12.2013

Хорошо, оказывается, что TFTP в моей ситуации не подходит. Я подключил Wireshark и увидел, что мой клиент отлично подключается к серверу через порт 69. Ранее я также убедился, что у меня правильно настроена переадресация портов на порт 69 в моих правилах iptable. Только что прочитал в Википедии:

Передача данных инициируется через порт 69, но порты передачи данных выбираются отправителем и получателем независимо друг от друга при инициализации соединения. Порты выбираются случайным образом в соответствии с параметрами сетевого стека, обычно из диапазона эфемерных портов.

т. е. TFTP у меня не работает, потому что мне нужен NAT, и он должен быть безопасным. Мне нужно использовать протокол, ориентированный на соединение, например, ftp.

Я обнаружил, что стандартная библиотека VxWorks также содержит ftpLib.h (http://www.vxdev.com/docs/vx55man/vxworks/ref/ftpLib.html#ftpLs), который, надеюсь, решит мои проблемы с NAT, поскольку FTP работает с TCP на основе соединения.

person stdcerr    schedule 05.12.2013