Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с TFTP.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Jenya7
Запускаю TFTP Server на стороне компьютера.

На стороне прибора создаю TFTP Client и пытаюсь скопировать файл с сервера.
Код
STATUS TFTP_GetFile(char *host_adr, char *targ_file_name, char *dest_file_name)
{
    FILE *file;
    int result;
    
    file = open (dest_file_name, O_RDWR | O_CREAT, 0644);
    
    result = tftpCopy (host_adr, 0, targ_file_name, "get", "ascii", file);
    
    if (result == OK)
        printf("TFTP DATA OK\n");
    else
        printf("TFTP DATA TRANSFER FAIL\n");
    
    return result;
}

//в таске
TFTP_GetFile(server_ip, "C:/Users/General/Desktop/TFTP_DIR/data.txt", "test.txt");

получаю сообщение от сервера
Цитата
Connection received from 10.0.0.10 on port 51398 [19/09 12:22:45.036]
Read request for file <C:/Users/General/Desktop/TFTP_DIR/data.txt>. Mode netascii [19/09 12:22:45.036]
File <C:\Users\General\Desktop\TFTP_DIR\data.txt> : error 123 in system call CreateFile The filename, directory name, or volume label syntax is incorrect. [19/09 12:22:45.036]

В чем может быть проблема? Мне кажется что файл не создается по каким то причинам.
file = open (dest_file_name, O_RDWR | O_CREAT, 0644);
Lagman
Если файл с таким именем существует на сервере то я бы еще обратил внимание на слеши в пути и вообще на путь, т.к. те сервера tftp которыми я пользовался выдавали файл из текущей директории (т.е. где запущен сервер).
Jenya7
Цитата(Lagman @ Sep 19 2017, 17:01) *
Если файл с таким именем существует на сервере то я бы еще обратил внимание на слеши в пути и вообще на путь, т.к. те сервера tftp которыми я пользовался выдавали файл из текущей директории (т.е. где запущен сервер).

такой файл существует C:\Users\General\Desktop\TFTP_DIR\data.txt
и директория в сервере задана C:\Users\General\Desktop\TFTP_DIR
Barcooler
Цитата(Jenya7 @ Sep 19 2017, 17:25) *
такой файл существует C:\Users\General\Desktop\TFTP_DIR\data.txt
и директория в сервере задана C:\Users\General\Desktop\TFTP_DIR

Если у тебя у TFTP сервера корневая папка C:\Users\General\Desktop\TFTP_DIR\
То тебе в коде скорее всего надо написать просто
TFTP_GetFile(server_ip, "data.txt", "test.txt");

То есть TFTP клиент по умолчанию попадает в папку C:\Users\General\Desktop\TFTP_DIR\ и из нее должен забрать файлик data.txt
О структуре папок на твоём компе и тем более диске C: TFTP сервер клиенту не сообщает и по идее сам не должен лезть выше обозначенной папки.
Jenya7
Цитата(Barcooler @ Sep 20 2017, 02:24) *
Если у тебя у TFTP сервера корневая папка C:\Users\General\Desktop\TFTP_DIR\
То тебе в коде скорее всего надо написать просто
TFTP_GetFile(server_ip, "data.txt", "test.txt");

То есть TFTP клиент по умолчанию попадает в папку C:\Users\General\Desktop\TFTP_DIR\ и из нее должен забрать файлик data.txt
О структуре папок на твоём компе и тем более диске C: TFTP сервер клиенту не сообщает и по идее сам не должен лезть выше обозначенной папки.

спасибо! в этом была проблема. теперь я вижу сервер посылает файл. но я не могу прочесть содержимое. что то не так делаю
Код
STATUS TFTP_GetFile(char *host_adr, char *targ_file_name, char *dest_file_name)
{
    FILE *file;
    
    int result;
    int len;
    
    file = open (dest_file_name, O_RDWR | O_CREAT, 0644);
    
    result = tftpCopy (host_adr, 69, targ_file_name, "get", "ascii", file);
    
    if (result == OK)
        {
             len = read(file, buff, size);
         printf("TFTP DATA = %s\n", buff);
        }
    else
        printf("TFTP DATA TRANSFER FAIL\n");
    
    return result;
}

//в таске
char read_buf[1024];
TFTP_GetFile(server_ip, "data.txt", "test.txt", read_buff, 20);
gerber
Попробуйте вместо ascii режим binary.
Jenya7
Цитата(gerber @ Sep 20 2017, 12:54) *
Попробуйте вместо ascii режим binary.

попробовал binary. printf("TFTP DATA = %s\n", buff); возвращает мусор.
Barcooler
Какую программу TFTP сервера используете?
Возможно в настройках сервера необходимо указать вариант передачи.
И другой вопрос - получается-ли отправить на TFTP сервер файлик, лежащий уже на устройстве?
Если удаётся - получается-ли прочитать его содержимое на компе?
Jenya7
Цитата(Barcooler @ Sep 20 2017, 15:15) *
Какую программу TFTP сервера используете?
Возможно в настройках сервера необходимо указать вариант передачи.
И другой вопрос - получается-ли отправить на TFTP сервер файлик, лежащий уже на устройстве?
Если удаётся - получается-ли прочитать его содержимое на компе?

пользуюсь tftpd64. попробую отправить файл на сервер.
Barcooler
Цитата(Jenya7 @ Sep 20 2017, 12:29) *
пользуюсь tftpd64. попробую отправить файл на сервер.

Попробуй один и тот-же файл скопировать с сервера, а потом отправить обратно.
Если содержимое останется читаемым - значит проблема в контроллере, либо в содержимом самого текстового файлика.
Так-же попробуй создать текстовый файлик редактором типа sublime или notepad++ (если до этого файл создавался обычным блокнотом в винде).
Содержимое файла постарайся сделать минимальным - например 123.
Если такой файл прочитается девайсом - это будет говорить о том, что либо дело в кодировке, либо виндовый блокнот использует "запрещённые символы" biggrin.gif
XVR
Попробуйте позвать lseek(file,0,SEEK_SET) перед read
Barcooler
Всё?
Jenya7
Цитата(Barcooler @ Sep 22 2017, 02:15) *
Всё?

проблемы с системой. sad.gif
Jenya7
Тут выясняется что я должен быть сервер. А как мне создать директорию в RAM?
Для NFS делают так
Код
mkdir("/ram0/MFL_FILES");

if(nfsExport("/ram0/MFL_FILES" ,555,FALSE,0 ) == ERROR)
{
    printf("ERROR EXPORTING /ram0/MFL_FILES \n");
}
else
{
    printf("EXPORTING O.K. /ram0/MFL_FILES \n");    
}

cd("/ram0")

А как сделать для TFTP?
XVR
Зачем вам директория в RAM? Зачем вам вообще файловая система? TFTP сервер должен принимать и отдавать файлы по имени, а где они будут лежать, и какие имена могут быть - это целиком внутреннее дело самого сервера.
Считайте, что у вас все файлы лежат просто списком, но имя файла может содержать символ '/'

https://ru.wikipedia.org/wiki/TFTP
Jenya7
Цитата(XVR @ Oct 3 2017, 15:00) *
Зачем вам директория в RAM? Зачем вам вообще файловая система? TFTP сервер должен принимать и отдавать файлы по имени, а где они будут лежать, и какие имена могут быть - это целиком внутреннее дело самого сервера.
Считайте, что у вас все файлы лежат просто списком, но имя файла может содержать символ '/'

https://ru.wikipedia.org/wiki/TFTP

Да но мне нужно организовать передачу файлов по TFTP между двумя системами. Я должен быть сервером.
Клиент должен знать куда стучаться? адрес, порт, путь к файлу? я что не должен у себя это определить?

в приведенном примере для NFS создается директория mkdir("/ram0/MFL_FILES"); и она привязывается к NFS nfsExport("/ram0/MFL_FILES" ,555,FALSE,0 )
разве мне не нужно сделать что то подобное?
XVR
Клиент стучится на tftp порт (69) на ваш IP, в запросе передает имя файла, и вы должны его принять или передать (в зависимости от запроса). Куда физически попадет файл целиком зависит от самого tfpt сервера (того самого, что слушает на 69 порту).
Цитата
Да но мне нужно организовать передачу файлов по TFTP между двумя системами.
У вас файлы на вашей системе физически есть? Если да, то их и передавайте (с теми путями, какие поддерживает ваша файловая система, где файлы живут)
Если нет - то какое вообще назначение этого вашего tfpt сервера? Ведь если файлов нет, то и обмениваться нечем wink.gif
Jenya7
Цитата(XVR @ Oct 3 2017, 15:18) *
Клиент стучится на tftp порт (69) на ваш IP, в запросе передает имя файла, и вы должны его принять или передать (в зависимости от запроса). Куда физически попадет файл целиком зависит от самого tfpt сервера (того самого, что слушает на 69 порту).
У вас файлы на вашей системе физически есть? Если да, то их и передавайте (с теми путями, какие поддерживает ваша файловая система, где файлы живут)
Если нет - то какое вообще назначение этого вашего tfpt сервера? Ведь если файлов нет, то и обмениваться нечем wink.gif


то есть допустим я создаю директорию
Код
mkdir("/ram0/TFTP_FILES");

клиент может положить туда файл и взять оттуда файл? я не должен конфигурировать у себя ничего?
XVR
Для начала вы должны поднять у себя tftp сервер. Затем сказать ему (серверу), где у вас лежат файлы для обмена с клиентами. В засисимости от сервера это может быть сделано самыми разными путями. Если сервер напрямую работает с файловой системой, то нужно сказать ему путь до корневой папки, где ему резвится. Если сервер является глубоко embedded приложением и не контактирует с реальной файловой системой (например по причине ее отсуствия), то у него должны быть свои собственные методы по эмуляции файловой системы для клиентов.
У вас что используется в качестве сервера?
Jenya7
Цитата(XVR @ Oct 3 2017, 16:30) *
Для начала вы должны поднять у себя tftp сервер. Затем сказать ему (серверу), где у вас лежат файлы для обмена с клиентами. В засисимости от сервера это может быть сделано самыми разными путями. Если сервер напрямую работает с файловой системой, то нужно сказать ему путь до корневой папки, где ему резвится. Если сервер является глубоко embedded приложением и не контактирует с реальной файловой системой (например по причине ее отсуствия), то у него должны быть свои собственные методы по эмуляции файловой системы для клиентов.
У вас что используется в качестве сервера?

я пользуюсь tftpLib в vxWorks. Там есть tftpInit() но это скорее для клиента а насчет сервера там все невнятно. нигде не смог найти внятного описания.
я создал директорию mkdir("/ram0/TFTP_FILES"); но как связать ее с TFTP?
XVR
Цитата(Jenya7 @ Oct 3 2017, 15:06) *
я пользуюсь tftpLib в vxWorks.
Это библиотека для клиента tftp. Вам нужна tftpdLib (это сервер)
Функция tftpdInit запускает сервер с заданным списком директорий, откуда/куда подсоединившийся клиент сможет обмениваться файлами

Jenya7
Цитата(XVR @ Oct 3 2017, 19:32) *
Это библиотека для клиента tftp. Вам нужна tftpdLib (это сервер)
Функция tftpdInit запускает сервер с заданным списком директорий, откуда/куда подсоединившийся клиент сможет обмениваться файлами

О! Вот спасибо! То что нужно.

Не получается подключить библиотеку. sad.gif
Код
STATUS TFTP_Setup(int stack_size)
{
  char *dir = "/ram0/TFTP_FILES";
            
  mkdir(dir);
    
  tftpdInit(stack_size, 1, " ", FALSE, 1);
    
  tftpdDirectoryAdd(dir);
    
        
  return OK;
}

при компиляции получаю
Цитата
dld: warning: Undefined symbol 'tftpdDirectoryAdd' in file 'tftp.o'
dld: warning: Undefined symbol 'tftpdInit' in file 'tftp.o'
dld: error: Undefined symbols found - no output written

функции 'tftpdDirectoryAdd и tftpdInit в tftpdLib.h определены как extern . tftpdLib.h откуда то их тянет. но в tftpdLib.h ошибка не генерерируется значит функции присутствуют. почему тогда я получаю ошибку?
XVR
Может их вообще нет? Забыли реализовать sm.gif
Подайте список директорий в tftpdInit. Если вам не надо на ходу этот список менять, то этого будет достаточно.
Jenya7
В vxWorks 6.9 они убрали эти функции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.