Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

Альтернативная передача файлов + чат.

12.04.2010, 13:35. Показов 1781. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Надо поддерживать на одном порту:
1. Управление, причём, не всей системой, а только самой этой прогой.
2. Передачу:
2.1. Координат курсора.
2.2. Текста.
2.3. Файлов.
2.4. Скринов экрана.
2.5. Синхронного скринвидео.
Учесть:
1. Файл может не влезать в пакет сетевого уровня.
2. Несколько клиентов одного сервера могут предавать файлы одновременно.
3. Клиент, или тот, кто сидит непосредственно за сервером, может, не дождавшись окончания передачи одного файла, дать команду на передачу следующего.
4. Клиент может получать файлы через сервер от других клиентов, в том числе.
5. Несколько клиентов могут направить файлы одному.
6. Файлы можно отправить и на сам сервер.
Порезать один файл я могу. А как не потерять и не перепутать фрагменты сразу нескольких файлов?

Добавлено через 43 секунды
Кстати, как определить максимальный размер поля данных пакета протокола сетевого уровня?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2010, 13:35
Ответы с готовыми решениями:

Чат в Delphi, передача файлов
Народ как в delphi с помощью SendBuf передавать любой тип фалов. Клиент и сервер являются разными...

Чат локальной сети. Передача больших файлов
есть проэкт, скачаный с интернета. Суть в чем это локальный сайт с поддержкой передачи файлов...

Нужна альтернативная по качеству прога для воспроизведения аудио файлов
нужна альтернативная по качеству прога для воспроизведения аудио файлов..использую aimp 3.0? чтоб...

Чат (передача месаг по интернету)
Ну, в общем написал я небольшой многопользовательский чат, оч простенький, на TcpClient и...

15
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
12.04.2010, 14:13 2
Порезать один файл я могу. А как не потерять и не перепутать фрагменты сразу нескольких файлов?
Зачем его резать?

Кстати, как определить максимальный размер поля данных пакета протокола сетевого уровня?
Опять таки - нафиг?

Есть сокеты, которые решают все эти проблемы за тебя. Если тебе нельзя юзать сокеты, и ты пытаешся напрямую работать с драйвером, то знаний для этой задачи у тебя явно маловато, и я не рекомендовал бы тебе за неё браться.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.04.2010, 05:23  [ТС] 3
Цитата Сообщение от Alexandoros Посмотреть сообщение
Зачем его резать?
Затем, что в поле данных пакета сетевого уровня он не влезает.
Цитата Сообщение от Alexandoros Посмотреть сообщение
Есть сокеты, которые решают все эти проблемы за тебя.
Я и хочу сокетами, но этих проблем они не решают. При попытке отправить больше, оправляется максимум. Таким образом я могу найти максимум, но мне надо, чтоб определялось автоматически и было известно не только серверу, но и клиентам.

Добавлено через 2 минуты
Цитата Сообщение от Alexandoros Посмотреть сообщение
то знаний для этой задачи у тебя явно маловато
Согласен, но тебе откуда это известно?
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
14.04.2010, 06:18 4
Цитата Сообщение от taras atavin Посмотреть сообщение
Затем, что в поле данных пакета сетевого уровня он не влезает. Я и хочу сокетами, но этих проблем они не решают. При попытке отправить больше, оправляется максимум. Таким образом я могу найти максимум, но мне надо, чтоб определялось автоматически и было известно не только серверу, но и клиентам.
Омг. Да какое тебе дело скоко влазит в ип пакет? Ты написал на хост1 send, оно и отправило столько, сколько написал. Ни больше, ни меньше( если без ошибок завершился вызов) Написал на хост2 recv винда и приняла, сколько попросил, ни больше, ни меньше( если без ошибок завершился вызов, или даные не кончились). Порежется/склеится все без тебя. Представь себе один сокет как трубу с водой - что влили то и выливается. Не важно сколько раз влили, оно все выливатся будет одним потоком. Поэтому сначало передают размер файла, потом файл. И ничего там не перепутается, как послал, так и примется.

Цитата Сообщение от taras atavin Посмотреть сообщение
Добавлено через 2 минуты
Согласен, но тебе откуда это известно?
ЛОЛ. Ну, телепат я.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.04.2010, 07:47  [ТС] 5
Цитата Сообщение от Alexandoros Посмотреть сообщение
Ты написал на хост1 send, оно и отправило столько, сколько написал.
. Бред. Отправляется ровно один пакет сетевого уровня, принимающий сокет из него вытаскивает поле данных, остальное выбрасывает. То, что выброшено, мне и не надо. Но есть максимум передаваемого поля. В моей сети это 1500 байт, а мне надо передать несколько десятков мегабайт. Столько не влазит, а сокеты сдесь не помощники. Отправляющий сокет отправляет сколько влезет (а не сколько написано), а остальное выбрасывает.

Добавлено через 14 минут
Ошибок при этом не происходит.
Цитата Сообщение от Alexandoros Посмотреть сообщение
Порежется/склеится все без тебя.
Сокеты этого не умеют. Сокеты - это не труба, а транспортный цех со своей косой разливкой по бутылкам. Я отправляю тон десять соляной кислоты, разбавленной до одного промиле и четыре тнооны серной с концентрацией ещё порядка на два меньше, а приходят тысячи бутылок по полтора литра. Задача: слить серную кислоту в одну цистерну, соляную - в другую, на обеих написать, что внутри и ни одну бутылку не перепутать (не вылить не в ту цистерну). Если вообще все бутылки не в свои цистерны и надписи тоже наоборот, то не беда, а смешивать нельзя. И в процессе отправки добавляется полцентнера сухой щелочи, которую надо всю в третью цистерну и написать KOH 100%, а не высыпать половину порошка в обе кислотные цистерны. Причём, если я привезу сразу всю свою цистерну и отдам, то первую бутылку наполнят и пошлют, а остальная кислота будет на полу цеха, поэтому надо разлить самому и отдать бутылки. Их погрузят каждую на отдельную машину выпишут на каждую путевой лист, а потом надо снова слить всё в цистерны, сливать в цистерны придётся самому, а путевые листы мне даже не покажут, поэтому, чтобы не перепутать бутылки я ещё должен их все промаркировать этикетками. Если ты этим не занимался и знаешь ещё меньше меня, то лучше не отвечай. Я сам знаю мало, но хоть это смог обнаружить экспериментальным путём, а у тебя одни рассуждения о трубах.

Добавлено через 1 минуту
Кстати, есть ли сокеты на gcc? И можно ли такую софтину написать вообще в кросплатформе?
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
14.04.2010, 14:52 6
У тебя очень особое воображение. У драйвера есть буфер куда он лепит все твои пакеты сам, без твоего участия, и сортирует тоже.

Не надо рассекать здесь мысью по древу, напиши клиент и сервер, и попробуй, а изыски своего воображения иди расскажи тому, кому они нужнее. Это у тебя проблема с сетью, не забыл еще?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.04.2010, 10:58  [ТС] 7
Я уже пробовал. А ты ещё нет? Только рассуждаешь о том, что сокет якобы берёт всё на себя и подобен трубе? Я послал 27 мегабайт, пришло 1500 байт в одном пакете, а остаток не дошел совсем.
Цитата Сообщение от Alexandoros Посмотреть сообщение
У драйвера есть буфер куда он лепит все твои пакеты сам, без твоего участия, и сортирует тоже.
Сокет только режет, но не лепит и не сортирует.
Цитата Сообщение от Alexandoros Посмотреть сообщение
У тебя очень особое воображение.
Это ты заговорил о трубах и жидкостях.
Цитата Сообщение от Alexandoros Посмотреть сообщение
Это у тебя проблема с сетью.
Вот именно. И не надо меня убеждать, что такой проблемы вообще нет. Факт её существования мне известен лучше, а не хуже, именно потому, что эта проблему у меня. Короткие пакеты я и сам очень даже хорошо умею отправлять и получать, а длинные приходят в урезанном виде.

Добавлено через 14 минут
Кажется придумал вариант автоизмерения максимума.

Максимум определяет сервер. Для этого он в в цикле наращивает длину пакета и отправляет себе со второго клиентского сокета на адрес 127.0.0.1, пока не получит меньше, чем отправил, а клиенты получают измеренное таким образом значение с сервера, в его пакете, идентифицирующем протокол.

Есть лучшее решение? Каковы дыры этого решения? Каковы минимальные ограничения длины поля данных пакетов протоколов канального и сетевого уровня?

Добавлено через 2 часа 6 минут
Мои наброски по резке файлов, кадров, скриншотов:
1.Каждый пакет начинается кодом назначения.
2. Далее в пакетах, передаваемых сервером идёт код типа источника: 00h - клиент, FFh — сервер.
3. В транзитные пакеты сервер добавляет номер клиента-источника сразу после вида кода вида источника.
4. Каждый файл, скриншот, или скринвидео идёт в своей группе пакетов. Группы нумеруются восьми байтными номерами в пределах каждого вида трафика. Номер завершённой группы освобождается и передаётся последней группе того же вида. 5. Номер группы указывается в пакете после вида источника, а в транзитных пакетах после
6. Для каждой группы создаётся специальный растущий буфер приёма, привязанный к её номеру, виду трафика и к источнику.
7. Буфер группы скринвидео создаётся заново для каждого нового кадра. При этом только что принятый кадр отображается на экран, а использованный буфер сразу очищается.
8. Каждая группа начинается и завершается маркерным пакетом.
9. Во всех пакетах группы указываетсяы номер группы:
9.1. Если пакет отправлен с клинета на сервер - после кода назначения.
9.2. Если пакет отправлен с сервера клиенту - после кода вида источника.
9.3. Если пакет транзитный - после номера клиента-источника.
10.1.1. Далее в каждом пакете файловой группы, идёт внутри групповой восьми байтный номер пакета. Стартовый маркет имеет номер 0.
10.1.2. Стартовые маркеры файловых групп содеражат имя файла после номера пакета.
10.2.1. Далее в каждом пакете файловой группы, идёт внутри групповой восьми байтный номер пакета. Стартовый маркет имеет номер 0.
10.2.2. Стартовые маркеры скиншотовых групп содержат размеры растра после номера пакета.
10.3.1. Далее в каждом пакете группы скринвидео идёт номер пакета.
10.3.2. Каждый кадр скринвидео начинается и завершается отдельным маркером.
10.3.2.1. В группах скринвидео каждый пакет имеет восьми байтный внутрикадровый номер после номера группы. Номер стартового маркера 0.
10.3.2.2. Стартовые маркеры кадров содержат размеры кадра.
Каковы дыры этого решения?
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
15.04.2010, 12:20 8
Цитата Сообщение от taras atavin Посмотреть сообщение
Я уже пробовал.
Код в студию, и я покажу ошибки.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
15.04.2010, 12:46  [ТС] 9
Сервер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned long int i;
unsigned long int f; 
unsigned long int n; 
void *p;
p=(void *) new char [FileSize+4]; // FileSize - переменная, объявленная в голове модуля и хранящая размер файла. В это месте равна 27*1024*1024. Размер измерен заранее и файл сразу закрыт. Правой кнопкой по файлу проверял - совпадает.
File=...; // Как-то открываю файл. Как именно, не помню, но он открылся для чтения.
*((unsigned long int *)p)=FileSize;
FileRead(File,p,FileSize, n+4); // После выполнения этой строки n=FileSize.
for (i=Clients-1; i>=0; --i) //Clients - объявленная в голове модуля и хранящая число подключившихся клиентов
{
 Connections[i].SendBuff(p,FileSize+4);
}
// Закрываем файл.
delete [] p;
Обработчик OnRead клиента:
C++
1
2
3
4
5
6
7
unsigned long int l; 
unsigned long int n;
void *p;
Connection.ResiveBuff(&l,4); // После исполнения l=27*1024*1024
p=(void *) new char [l];
n=Connection.ResiveVBuff(p,l); // После исполнения n=1500
delete [] p;
выполнен один раз.
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
15.04.2010, 13:58 10
Добавь код
Connections[i].SendBuff
Connection.ResiveBuff

+ код ожидания, т.е. при каких условиях вызывается OnRead.
Дeтализируй до уровня send/recv(wsasend)

И не пиши с головы, дай реальный код. (FileRead, может таки ReadFile ?) А размер файла проще узнать через GetFileSize.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.04.2010, 06:20  [ТС] 11
Цитата Сообщение от Alexandoros Посмотреть сообщение
при каких условиях вызывается OnRead.
Если хоть что-то есть для приёма.

Цитата Сообщение от Alexandoros Посмотреть сообщение
Connections[i].SendBuff
Connection.ResiveBuff
Читай мой код, там это уже есть.

Добавлено через 2 минуты
Цитата Сообщение от Alexandoros Посмотреть сообщение
FileRead, может таки ReadFile
У меня есть обе, причём, одна явно оболочка для другой, а использована именно FileRead.

Добавлено через 3 минуты
Цитата Сообщение от Alexandoros Посмотреть сообщение
И не пиши с головы, дай реальный код.
Доступ в сеть имею только из-под linux, а тот код был в болэнде на то
В linux через
Подскажи, как серверный и клиентский сокеты зовут в эклипсе и в какой голове они валяются.

Добавлено через 3 минуты
Цитата Сообщение от Alexandoros Посмотреть сообщение
И не пиши с головы, дай реальный код.
У меня сеть только из под linux, а тот код был в болэнде под виндой, на той же машине, до переустановки на ней оси и давно стёрт. Есть в linux какие-нибудь сокеты под эклипсом? Как их зовут? В какой голове валяются?
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
16.04.2010, 12:20 12
Читай мой код, там это уже есть.
Где оно там есть? Там только вызовы а не код. Короче, покажеш код на уровне send/recv, тогда и поговорим, а до этого будем считать что нифига ты не писал, а только голову морочиш.

Если хоть что-то есть для приёма.
Это вообще гениально. Я ж и прошу показать код, как оно узнает "что есть что-то для приема". У тебя реально хороший план.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.04.2010, 12:26  [ТС] 13
Это обработчик события, его наступление отслеживала винда.

Добавлено через 3 минуты
Цитата Сообщение от Alexandoros Посмотреть сообщение
Там только вызовы а не код.
Сам же сказал сокетами, а теперь требуешь через внутренности апишки.
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
19.04.2010, 14:11 14
Цитата Сообщение от taras atavin Посмотреть сообщение
Сам же сказал сокетами, а теперь требуешь через внутренности апишки.
Какие апишки? Ты вообще, что под сокетами понимаеш?

http://msdn.microsoft.com/en-u... S.85).aspx Читай отсюда и до просветления.

И поищи примеры в нете клиента и сервера на апи. Они на одну страницу умещаются.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.04.2010, 06:02  [ТС] 15
Болэндовские компоненты TClientSocket и TServerSocket, или их аналоги (но аналогов я пока не видел).
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
23.04.2010, 22:44 16
taras atavin, что-то вы действительно путаете.
Хотите использовать чистые сокеты? Почитайте Криса Касперски: http://www.insidepro.com/kk/006/006r.shtml

Тут есть и описание функций и реализация простейших приложений.

Компоненты TClientSocket, TServerSocket на данный момент уже не существуют в новых версиях IDE. В свободное пользование их переделанные варианты предоставляет Indy.
0
23.04.2010, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2010, 22:44
Помогаю со студенческими работами здесь

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

поиск файлов,чат и тд
помогите решить

Потоковая передача данных (аля чат рулет) с чего начать ?
Сразу начну с извинений не знаю даже где и создать эту тему ! если не там сделал перенесите !...

Чат с отправкой файлов(Сокет)
Помогите пожалуйста с отправкой файлов, чтобы можно было нажать кнопку и смог выбрать файл и его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru