реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с TFTP.
Jenya7
сообщение Sep 19 2017, 09:41
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Запускаю 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);
Go to the top of the page
 
+Quote Post
Lagman
сообщение Sep 19 2017, 11:01
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Если файл с таким именем существует на сервере то я бы еще обратил внимание на слеши в пути и вообще на путь, т.к. те сервера tftp которыми я пользовался выдавали файл из текущей директории (т.е. где запущен сервер).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 19 2017, 14:25
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Lagman @ Sep 19 2017, 17:01) *
Если файл с таким именем существует на сервере то я бы еще обратил внимание на слеши в пути и вообще на путь, т.к. те сервера tftp которыми я пользовался выдавали файл из текущей директории (т.е. где запущен сервер).

такой файл существует C:\Users\General\Desktop\TFTP_DIR\data.txt
и директория в сервере задана C:\Users\General\Desktop\TFTP_DIR
Go to the top of the page
 
+Quote Post
Barcooler
сообщение Sep 19 2017, 20:24
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 7-03-11
Из: Владимир
Пользователь №: 63 445



Цитата(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 сервер клиенту не сообщает и по идее сам не должен лезть выше обозначенной папки.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 20 2017, 06:46
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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);
Go to the top of the page
 
+Quote Post
gerber
сообщение Sep 20 2017, 06:54
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Попробуйте вместо ascii режим binary.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 20 2017, 07:28
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(gerber @ Sep 20 2017, 12:54) *
Попробуйте вместо ascii режим binary.

попробовал binary. printf("TFTP DATA = %s\n", buff); возвращает мусор.
Go to the top of the page
 
+Quote Post
Barcooler
сообщение Sep 20 2017, 09:15
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 7-03-11
Из: Владимир
Пользователь №: 63 445



Какую программу TFTP сервера используете?
Возможно в настройках сервера необходимо указать вариант передачи.
И другой вопрос - получается-ли отправить на TFTP сервер файлик, лежащий уже на устройстве?
Если удаётся - получается-ли прочитать его содержимое на компе?

Сообщение отредактировал Barcooler - Sep 20 2017, 09:16
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 20 2017, 09:29
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

пользуюсь tftpd64. попробую отправить файл на сервер.
Go to the top of the page
 
+Quote Post
Barcooler
сообщение Sep 20 2017, 09:54
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 7-03-11
Из: Владимир
Пользователь №: 63 445



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

Попробуй один и тот-же файл скопировать с сервера, а потом отправить обратно.
Если содержимое останется читаемым - значит проблема в контроллере, либо в содержимом самого текстового файлика.
Так-же попробуй создать текстовый файлик редактором типа sublime или notepad++ (если до этого файл создавался обычным блокнотом в винде).
Содержимое файла постарайся сделать минимальным - например 123.
Если такой файл прочитается девайсом - это будет говорить о том, что либо дело в кодировке, либо виндовый блокнот использует "запрещённые символы" biggrin.gif
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 20 2017, 10:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Попробуйте позвать lseek(file,0,SEEK_SET) перед read
Go to the top of the page
 
+Quote Post
Barcooler
сообщение Sep 21 2017, 20:15
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 7-03-11
Из: Владимир
Пользователь №: 63 445



Всё?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 24 2017, 12:38
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Barcooler @ Sep 22 2017, 02:15) *
Всё?

проблемы с системой. sad.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 3 2017, 08:11
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Тут выясняется что я должен быть сервер. А как мне создать директорию в 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?

Сообщение отредактировал Jenya7 - Oct 3 2017, 08:12
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 3 2017, 10:00
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

https://ru.wikipedia.org/wiki/TFTP
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 3 2017, 10:05
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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 )
разве мне не нужно сделать что то подобное?

Сообщение отредактировал Jenya7 - Oct 3 2017, 10:08
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 3 2017, 10:18
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Клиент стучится на tftp порт (69) на ваш IP, в запросе передает имя файла, и вы должны его принять или передать (в зависимости от запроса). Куда физически попадет файл целиком зависит от самого tfpt сервера (того самого, что слушает на 69 порту).
Цитата
Да но мне нужно организовать передачу файлов по TFTP между двумя системами.
У вас файлы на вашей системе физически есть? Если да, то их и передавайте (с теми путями, какие поддерживает ваша файловая система, где файлы живут)
Если нет - то какое вообще назначение этого вашего tfpt сервера? Ведь если файлов нет, то и обмениваться нечем wink.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 3 2017, 10:25
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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


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

клиент может положить туда файл и взять оттуда файл? я не должен конфигурировать у себя ничего?
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 3 2017, 11:30
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Для начала вы должны поднять у себя tftp сервер. Затем сказать ему (серверу), где у вас лежат файлы для обмена с клиентами. В засисимости от сервера это может быть сделано самыми разными путями. Если сервер напрямую работает с файловой системой, то нужно сказать ему путь до корневой папки, где ему резвится. Если сервер является глубоко embedded приложением и не контактирует с реальной файловой системой (например по причине ее отсуствия), то у него должны быть свои собственные методы по эмуляции файловой системы для клиентов.
У вас что используется в качестве сервера?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 3 2017, 12:06
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

я пользуюсь tftpLib в vxWorks. Там есть tftpInit() но это скорее для клиента а насчет сервера там все невнятно. нигде не смог найти внятного описания.
я создал директорию mkdir("/ram0/TFTP_FILES"); но как связать ее с TFTP?

Сообщение отредактировал Jenya7 - Oct 3 2017, 12:07
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 3 2017, 14:32
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 3 2017, 14:57
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(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 ошибка не генерерируется значит функции присутствуют. почему тогда я получаю ошибку?

Сообщение отредактировал Jenya7 - Oct 4 2017, 09:51
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 4 2017, 10:13
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Может их вообще нет? Забыли реализовать sm.gif
Подайте список директорий в tftpdInit. Если вам не надо на ходу этот список менять, то этого будет достаточно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 10 2017, 07:29
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



В vxWorks 6.9 они убрали эти функции.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.0158 секунд с 7
ELECTRONIX ©2004-2016