Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2012, 01:58   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию Передача файлов и сообщений

Здравствуйте. Перелистал уже кучу форумов, но всё никак не могу найти(придумать) алгоритм для передачи файла по сети, используя один TCP сокет. Точнее: мне надо передавать файл и принимать команды одновременно. Пока же я только натыкался на примеры, в которых программа переходит в режим принятия файла и до получения нужного объёма пишет все данные в файл, потом же возвращается к приему команд. То есть, если в момент передачи файла передать команду, она будет записана в файл. Очень прошу, натолкните на мысль. Важен даже не столько алгоритм, сколько сама идея. Как например отличить кусок файла, от куска команды(если произошла фрагментация последней).

PS: Фрагментацию сообщений поборол, используя буфер, куда складываются все части команды. После того как будет получена уникальная завершающая последовательность байт, команда передается на анализ.
hiho вне форума Ответить с цитированием
Старый 24.06.2012, 10:29   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

самое простое — общаться своими пакетами. типа

Код:
mypacket = packed record
  ptype: byte;
  psize: word;
  pdata: record end;
end;
тип пакета (ptype) определяет, что это за пакет: очередная часть файла, команда или ещё что-то. psize задаёт длину данных в пакете. ну а pdata уже содержит сами данные.

таким образом, вы сможете передавать файл небольшими пакетами и свободно вставлять между ними пакеты с командами.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.06.2012, 20:58   #3
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
самое простое — общаться своими пакетами. типа

Код:
mypacket = packed record
  ptype: byte;
  psize: word;
  pdata: record end;
end;
Хех, вечно я забываю про использование структур. Спасибо огромное. Теперь осталось научить сервер интерпретировать поступивший поток информации как структуру и разбирать её. Дело в том, что сервер написан на масме, в котором я со структурами сталкивался всего пару раз.
hiho вне форума Ответить с цитированием
Старый 24.06.2012, 22:18   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ну структуру это я так, для примера набросал. Основная идея в том, что файло заливается не единым куском, а блоками. И между этими блоками мы можем безболезненно вставлять сообщения или что угодно другое. Т.е. над потоко-ориентированным ТСП мы надстраиваем свой простенький блочный протокол. Ну а т.к. каждый блок имеет одинаковый формат (заголовок), удобно оформить это как структуру. Работать с ней можно точно так же, как и с "непрерывным" блоком данных, просто смещаясь от одного поля к другому.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 24.06.2012, 22:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Главное чтоб в структуре не было динамически изменяющихся переменных. А то придется и их размеры передавать в пакете.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2012, 23:01   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Главное чтоб в структуре не было динамически изменяющихся переменных. А то придется и их размеры передавать в пакете.
тип пакета, размер, потом данные, этого достаточно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.06.2012, 01:25   #7
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

передачу уже реализовал после первого поста =) Сейчас важен только прием на Масме, Да бы не создавать отдельную тему спрошу тут: Никто не подскажет как с помощью WinSock принять структуру и разобрать её? Просто всего пару раз видел структуры в масме, но никогда не работал
hiho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача сообщений через serversocket и clientsocket virtuhay266 Помощь студентам 1 14.12.2011 22:54
передача сообщений по локалке Student1992 Общие вопросы C/C++ 3 26.11.2011 14:54
Передача сообщений по протоколу UDP elmer C# (си шарп) 5 06.04.2011 16:31
Передача сообщений по протоколу UDP elmer Работа с сетью в Delphi 4 05.04.2011 12:54
Передача файлов Lemo Помощь студентам 16 19.05.2010 17:39