|
Работа с TFTP. |
|
|
|
Sep 19 2017, 09:41
|
Профессионал
    
Группа: Участник
Сообщений: 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);
|
|
|
|
|
Sep 19 2017, 20:24
|
Участник

Группа: Участник
Сообщений: 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 сервер клиенту не сообщает и по идее сам не должен лезть выше обозначенной папки.
|
|
|
|
|
Sep 20 2017, 06:46
|
Профессионал
    
Группа: Участник
Сообщений: 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);
|
|
|
|
|
Sep 20 2017, 09:15
|
Участник

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

|
Какую программу TFTP сервера используете? Возможно в настройках сервера необходимо указать вариант передачи. И другой вопрос - получается-ли отправить на TFTP сервер файлик, лежащий уже на устройстве? Если удаётся - получается-ли прочитать его содержимое на компе?
Сообщение отредактировал Barcooler - Sep 20 2017, 09:16
|
|
|
|
|
Sep 20 2017, 09:54
|
Участник

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

|
Цитата(Jenya7 @ Sep 20 2017, 12:29)  пользуюсь tftpd64. попробую отправить файл на сервер. Попробуй один и тот-же файл скопировать с сервера, а потом отправить обратно. Если содержимое останется читаемым - значит проблема в контроллере, либо в содержимом самого текстового файлика. Так-же попробуй создать текстовый файлик редактором типа sublime или notepad++ (если до этого файл создавался обычным блокнотом в винде). Содержимое файла постарайся сделать минимальным - например 123. Если такой файл прочитается девайсом - это будет говорить о том, что либо дело в кодировке, либо виндовый блокнот использует "запрещённые символы"
|
|
|
|
|
Sep 21 2017, 20:15
|
Участник

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

|
Всё?
|
|
|
|
|
Oct 3 2017, 08:11
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 3 2017, 10:05
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 3 2017, 10:25
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(XVR @ Oct 3 2017, 15:18)  Клиент стучится на tftp порт (69) на ваш IP, в запросе передает имя файла, и вы должны его принять или передать (в зависимости от запроса). Куда физически попадет файл целиком зависит от самого tfpt сервера (того самого, что слушает на 69 порту). У вас файлы на вашей системе физически есть? Если да, то их и передавайте (с теми путями, какие поддерживает ваша файловая система, где файлы живут) Если нет - то какое вообще назначение этого вашего tfpt сервера? Ведь если файлов нет, то и обмениваться нечем  то есть допустим я создаю директорию Код mkdir("/ram0/TFTP_FILES"); клиент может положить туда файл и взять оттуда файл? я не должен конфигурировать у себя ничего?
|
|
|
|
|
Oct 3 2017, 14:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(XVR @ Oct 3 2017, 19:32)  Это библиотека для клиента tftp. Вам нужна tftpdLib (это сервер) Функция tftpdInit запускает сервер с заданным списком директорий, откуда/куда подсоединившийся клиент сможет обмениваться файлами О! Вот спасибо! То что нужно. Не получается подключить библиотеку.  Код 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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|