Способы передачи файлов по сети. Кроссплатформенно.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Способы передачи файлов по сети. Кроссплатформенно.

Сообщение veresk » 06.06.2012 15:24:45

Решил вынести вопрос отдельно. Последний он у меня остался для проекта (после внедрения весь проект выложу с исходниками вместе, ясное дело).

В общем и целом, есть машина-сервер. На ней надо загрузить файл, распаковать его (это архив), проделать некоторые процедуры и отдать 10-30 компам в той же локальной сети или одним файлом (что проще, архивчиком), или набором файлов. При этом что "сервер", что "клиенты" могут быть и с Linux, и с Windows и вперемешку, что, скорее всего, и будет. После работы "клиентов" они должны вернуть файлик-ответ серверу, при этом перейти в неактивное состояние.
Приложение-сервер знает IP-адреса клиентов (это делается при настройке), клиенты не настраиваются никак, получая всё от сервера.
В данный момент всё это делается через SMB-расшары, то есть только в Windows, и вообще прототип на Delphi написан упоротым студентом 6 лет назад (то есть мной).
Я попробовал использовать LNet, но там раиуса кривизны рук хватило лишь на то, чтоб передать текстовое сообщение, и то почему-то повисло в итоге. Сейчас я сильно в замешательстве, что же разумнее делать:
1. Написать некоторую функцию, типа sendfile (filename: string; remote_ip: string) которая будет отдавать клиентам файл. Как это реализовать представляю с трудом. Плюс ко всему, в LNet это можно сделать лишь используя TCP сокет, да ещё и вручную следить за переполнением сетевого буфера (если я правильно понял разработчика LNet, он именно так и извращается). Метод GetMessage работает, а вот просто Get я так и не одолел, непонятно что делать с переменными типа aData.
2. Написать некоторый FTP-сервер, с которого клиенты будут забирать файлы самостоятельно и потом заливать туда файлы-ответы. Но как это сделать тоже малопонятно, компоненты FTP-клиент в LNet есть, а вот FTP-сервер нету.
3. Использовать сторонний FTP-сервер, наворачивая кучу костылей и извращений. Зато пример FTP-клиента есть.
4. Использовать какую-то другую сетевую компоненту, но какую и как - непонятно. И есть ли там где-то требуемый функционал.

Люди, подскажите, как быть?
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vitaly_l » 06.06.2012 16:09:36

Быть может: Synapse??? см. http://lazarus.su/other/skachivaem-fayl-po-ssyilke.html
Не очень понятно, что работает на стороне пользователя?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение veresk » 06.06.2012 16:16:39

Просто скачать файл с сервера - это не проблема, примеров много. Вопрос в том, как сам сервер организовать!

На стороне клиентов работает второй кусок моего же приложения, который должен получить файлик, поработать и отправить другой файлик в ответ серверу.
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение Ism » 06.06.2012 16:17:23

Curl ?
http://ru.wikipedia.org/wiki/CURL

Добавлено спустя 2 минуты 28 секунд:
А вообще есть сокеты, synapse должен уметь с ними работать

Добавлено спустя 50 секунд:
Или FileZilla

http://filezilla-project.org/

Добавлено спустя 48 секунд:
Или на худой конец Indy
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vada » 06.06.2012 17:17:45

В данный момент всё это делается через SMB-расшары, то есть только в Windows

Linux замечательно работает с SAMBA
Посмотрите еще в сторону NFS. На сервере можно расшарить каталог по NFS а с клиентов брать нужное и назад отдавать.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vitaly_l » 06.06.2012 18:25:29

veresk писал(а):работает второй кусок моего же приложения

Тогда нужно всего лишь дать команду "куску приложения" - скачай файл на http://MySite.ru/?file=MyFile? в смысле не сервер будет отправлять файл, а программа на стороне клиента по команде будет скачивать, а после обработки обратно загружать...


про работу сокетов, есть тут: http://www.delphimaster.ru/articles/socksrv/
(идентичные возможности есть у любого пакета)


.
Последний раз редактировалось vitaly_l 07.06.2012 06:52:28, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение Nik » 06.06.2012 21:27:24

Сокеты должны подойти. Пример работы в режиме клиент/сервер: viewtopic.php?f=10&t=7133
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение SSerge » 07.06.2012 05:11:08

vada писал(а):Linux замечательно работает с SAMBA
Посмотрите еще в сторону NFS. На сервере можно расшарить каталог по NFS а с клиентов брать нужное и назад отдавать.


Лет около двух назад, я столкнулся с тем, что если линукс-машина пытается обращаться к SMB-ресурсу, расположенному на другой линукс-машине, то исходные права пользователя (user id) с клиента транслируются на сервер и файлы, записанные таким клиентом, приобретают права доступа под его user id на сервере. Если, соответственно, эти права не совпадают, то такой пользователь сможет, например, записать файл, но ему будет запрещено его читать; в том числе, его не смогут прочитать и легитимные пользователи-клиенты под windows, поскольку, как понимаете, права доступа не совпадают с smbuser - доступ запрещен. Для NFS :D - ситуация та же, но в абсолютно демаскированном виде. То есть, если на одной машине vasia с id 500:500, а на другой vasia с id 501:501, записанный одним файл второй имеет шансы не прочитать :) Так что, не все однозначно хорошо и весело.

Более логичным видится FTP. Сервера есть под любую платформу, перечисленных выше нюансов нет. Если не извращаться с "русскими именами файлов", так все вообще выглядит весьма стабильным.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение veresk » 07.06.2012 09:08:12

Ism писал(а):Curl ?

Ism писал(а): FileZilla

Это всё для скачивания подойдёт, да. А мне надо как-то отдать файлик со своего же "сервера" и как это сделать? cURL умеет только скачиватьзакачивать, а не работать сервером.
vada писал(а):SAMBA

vada писал(а):NFS

Это всё есть жуткие костыли, сейчас всё так и работает, через SMB (то, что SAMBA умеет - не спорю, но смысла в этом всё-равно нету)
vitaly_l писал(а):Тогда нужно всего лишь дать команду "куску приложения" - скачай файл на http://MySite.ru/?file=MyFile? в смысле не сервер будет отправлять файл, а программа на стороне клиента по команде будет скачивать, а после обработки обратно загружать...

Да, открыть бы каталог с файлами для доступа из локалки и бед бы не знать. Клиенты подключились, засосали что им надо, кинули назад добро и поимели счастие через это дело. Но как открыть доступ к директории? Непонятно.
Nik писал(а):Сокеты должны подойти.

Наверное, только к ним никак не могу своими кривыми руками добраться. LNet умеет сокеты, а я смотрю в примеры и ничерта не понимаю.
SSerge писал(а):Более логичным видится FTP

Согласен, FTP как сервер выдачи клиентам файлов был бы идеален. Но как его реализовать?

Добавлено спустя 17 минут 30 секунд:
Если кто-то передавал большие файлы через LNet - поделитесь примером кода, плиз! Я разобрался, как передать текст
Отдали:
Код: Выделить всё
LTCPComponent1.SendMessage(out msg: string; aSocket: TLSocket=nil): Integer;

Приняли:
Код: Выделить всё
LTCPComponent1.GetMessage(out msg: string; aSocket: TLSocket=nil): Integer;

Есть нюансы с размером строки, точнее буфером сетевым, но ладно, разработчик боле-мене описал проблему и решение. Ну есть ещё проблемы с зависанием клиента и сервера, надо правильно обработку исключительных ситуаций запилить.

А вот как передать просто данные не понял, там, кажется, использовать надо
Отдать:
Код: Выделить всё
LTCPComponent1.Send(out aData; const aSize: integer; aSocket: TLSocket=nil): Integer;

Принять:
Код: Выделить всё
LTCPComponent1.Get(out aData; const aSize: integer; aSocket: TLSocket=nil): Integer;


Но что за aData не понятно и как это использовать вообще? А у разработчика не нашёл ни слова.
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vitaly_l » 07.06.2012 09:45:58

veresk писал(а):Да, открыть бы каталог с файлами для доступа из локалки и бед бы не знать.

Если я правильно понял, то текст Вы можете переслать... в тексте пересылаете адрес.
А дальше сторона пользователя делает запросы через обычный http.
И права на директорию - будут не нужны. Используйте, самые простые команды методом: GET.

Зачем Вам FTP итд? - там нужны права итп, а в HTTP - нет.
На директорию для закачки файлов пользователя выставите 777, и тогда: всё, что в неё сохранится - будет иметь 777...



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vada » 07.06.2012 09:51:08

SSerge писал(а):Лет около двух назад, я столкнулся с тем, что если линукс-машина пытается обращаться к SMB-ресурсу, расположенному на другой линукс-машине, то исходные права пользователя (user id) с клиента транслируются на сервер и файлы, записанные таким клиентом, приобретают права доступа под его user id на сервере. Если, соответственно, эти права не совпадают, то такой пользователь сможет, например, записать файл, но ему будет запрещено его читать; в том числе, его не смогут прочитать и легитимные пользователи-клиенты под windows, поскольку, как понимаете, права доступа не совпадают с smbuser - доступ запрещен. Для NFS :D - ситуация та же, но в абсолютно демаскированном виде. То есть, если на одной машине vasia с id 500:500, а на другой vasia с id 501:501, записанный одним файл второй имеет шансы не прочитать :) Так что, не все однозначно хорошо и весело.

Более логичным видится FTP. Сервера есть под любую платформу, перечисленных выше нюансов нет. Если не извращаться с "русскими именами файлов", так все вообще выглядит весьма стабильным.

Вам не нравятся кошки? Вы просто не умеете их готовить (с)
Чтоб вася имел uid везде одинаковый существует LDAP / Kerberos. Создать геморрой можно как на SMB ресурсе, так и на NFS и FTP. Так что вброс не засчитан. :wink:
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение veresk » 07.06.2012 09:56:07

vitaly_l писал(а):Если я правильно понял, то текст Вы можете переслать... в тексте пересылаете адрес.

Именно так и планирую сделать, если удасца сделать это:
vitaly_l писал(а):А дальше сторона пользователя делает запросы через обычный http.

Как я буду делать запрос через HTTP, если сторона сервера не является сервером HTTP? В LNet компонента HTTPserver в состоянии "experimental", я не готов побороть её глюки. Завести отдельный LAMP для раздачи файлов? Убиться можно.

Добавлено спустя 2 минуты 30 секунд:
vada писал(а):Вам не нравятся кошки? Вы просто не умеете их готовить (с)
Чтоб вася имел uid везде одинаковый существует LDAP / Kerberos. Создать геморрой можно как на SMB ресурсе, так и на NFS и FTP. Так что вброс не засчитан. :wink:

Люююдиии, метод с расшариванием папки через SMB, NFS и прочее отметён как костылестроительство на ровном месте. Давайте уже отвлечёмся от LDAP, я в нём понимаю гораздо больше, чем в Lazarus, но не то это всё, мне бы файлик раздать "клиентской стороне"
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение Brainenjii » 07.06.2012 09:59:35

э не ^_^ у нас несколько мазохистов c виндовзом.
Изредка, когда забудешь в svn что-нибудь мелкое выложить, чтобы не плодить ревизию захожу к таким через smb и копирую файлы. Они копируются с моими правами (логини в LDAP'e, разумеется). И изменить они их не могут. Приходится под админом выдавать нужные права...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение vada » 07.06.2012 10:34:50

Файл большой? Тот что надо клиентам раздавать?
Может SQL сервер поможет решить ваши проблемы?
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Способы передачи файлов по сети. Кроссплатформенно.

Сообщение veresk » 07.06.2012 10:55:41

vada писал(а):Файл большой? Тот что надо клиентам раздавать?
Может SQL сервер поможет решить ваши проблемы?


Файл достаточно большой, чтоб считать перегонку его в base64 плохой идеей: ориентировочно 10-100 Mb, этот файл - архив.
SQL сервер так же как и сторонний HTTP, FTP, SMB, NFS не подходит, решение надо единое, без сторонних зависимостей.

ЗЫ. неужто никто никогда файлы по сети не раздавал, а? Даже гугл ничего не гугляет хорошего.
veresk
новенький
 
Сообщения: 48
Зарегистрирован: 31.01.2012 12:23:32

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240

Рейтинг@Mail.ru