Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/75: Рейтинг темы: голосов - 75, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 22

Отправка файлов через IdUDPClient/IdUDPServer

16.12.2013, 20:50. Показов 15892. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я начинающий "программист", столкнулся с такой проблемой: как отправит файл по сети, именно файл!
Я сделал приложения работающее по сети, на dUDPClient/IdUDPServer компонентах, много чего организовал, вот возникла проблемка с отправкой файлов.
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button6Click(TObject *Sender)
{
        void *P;
    MS->LoadFromFile(text[1]); // text[1] хранит путь к файлу// Загружаем файл в буфер
    Status->Lines->Add("Файлы для отправки: ");
    Status->Lines->Add("file#"+text[1]+"#"+IntToStr(MS->Size)+" байт#");
    MS->Position = 0; // Переводим каретку в начало файла
    IdUDPClient1->SendBuffer(P, MS->Size); // отправляем поток
    MS->Clear();
}
Вот так не отправляется/
Искал по форуму ничего нужного не нашел... если такое уже было то дайте ссылочку плз
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2013, 20:50
Ответы с готовыми решениями:

IdUDPServer и IdUDPClient
С наступающим!) Для работы IdUDPServer и IdUDPClient нужно открывать порты у сервера и у клиента? Или только у сервера? До этого...

Смена порта idUdpClient idUdpServer
При первичной установке портов на сервере и клиенте, соединение устанавливается все работает. Но если надо изменить порт, то ничего сервер...

Как отправлять данные с IdUDPClient на IdUDPServer?
Всем привет! Научился отправлять данные с IdUDPServer на IdUDPClient. Как отправлять наоборот, то есть с сервера на клиент?

27
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 22
25.12.2013, 21:16  [ТС]
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void __fastcall TForm1::IdUDPServer3UDPRead(TIdUDPListenerThread *AThread, TBytes AData,
          TIdSocketHandle *ABinding)
{
 std::auto_ptr<TBytesStream> bs3(new TBytesStream(AData));
 if (name)
     {
       Status->Lines->Add("Server[3]::        Начинаю прием заголовка...");
       TStringStream * SS = new TStringStream();
       SS->CopyFrom(bs3.get(), 0);
       ShowMessage(SS->DataString);
       SaveDialog1->FileName = SS->DataString;  //присваиваем имя принимаемого файла
       delete SS;
       key=true;
       name=false;
     }
     if (!name)
     {
        Status->Lines->Add("Server[3]::        Начинаю прием файлов...");
        TStringStream * SS = new TStringStream();
        SS->CopyFrom(bs3.get(), 0);
        if (SS->DataString!="EndFile")  //если не конец файла то записываем все в поток
        {
          SSS->CopyFrom(bs3.get(), 0);
          delete SS;
        }
        else        //если файл закончился, то сохраняем его
        {
            Status->Lines->Add("Server[3]::        Получили конец файла");
          if (SaveDialog1->Execute())
          {
            SSS->SaveToFile(SaveDialog1->FileName);
            name=true;
            key=false;
            SSS->Clear();
          }
        }
     }
 //  if (key) name=false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{   int k=1;
    if(OpenDialog1->Execute())
 {
   //IdUDPClient1->Host=Edit1->Text;
   char buf[8192];    //типа 8192 - размеб буфера передачи по умолчанию
   TMemoryStream *ms = new TMemoryStream();
   Status->Lines->Add("Client[3]::        Шлем заголовок файла");
   ms->LoadFromFile(OpenDialog1->FileName);  //выбираем нужный файл
   IdUDPClient3->Send(ExtractFileName(OpenDialog1->FileName)); //посылаем имя файла
   ms->Position = 0;
 
   while (ms->Position < ms->Size)
   {
 
      k++;
     DWORD size = (ms->Size - ms->Position > 8192) ? 8192 : ms->Size - ms->Position;
     ms->ReadBuffer(&buf, size);
     TByteDynArray buff;
     buff.Length = 0;
     buff = RawToBytes(&buf, sizeof(buf));
     IdUDPClient3->SendBuffer(buff);  // отправляем поток
     Application->ProcessMessages();
   }
   Status->Lines->Add("Client[3]::        Послано");
   Status->Lines->Add(k);
   delete ms;
   Status->Lines->Add("Client[3]::        Послали конец файла");
   IdUDPClient3->Send("EndFile");  //индикатор конца файла
 }
 
}
//---------------------------------------------------------------------------
Подскажите почему не работает передача файлов? почему не срабатывает SaveDialog?
Миниатюры
Отправка файлов через IdUDPClient/IdUDPServer  
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 22
26.12.2013, 20:22  [ТС]
help! а то совсем обзац...
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
26.12.2013, 21:47
SaveDialog должен возникнуть только, если name=0, насколько мне удалось понять. Если этого не происходит - значит, там (в name) всегда ненулевое значение. А вообще (в качестве совета), - лучше методом исключения локализовать место возникновения ошибки, а то перелопачивать полсотни строк вашего кода незаинтересованным форумчанам несколько не с руки... .
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 22
27.12.2013, 01:05  [ТС]
Я совсем запутался, как должна работать пересылка. Вот у меня при отправке send отправляет клиент, на сервере сразу срабатывает чтение. Но при посылке через sendBufer сначало, судя по логам, оправляются все пакеты, а потом не понятно скока пакетов принимаются, хотя должно быть так 1 пакет отправлен, с другой стороны сразу принят. И так с каждым пакетом. Я совсем запутался.....
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.12.2013, 02:26
Ну тут нет пакетов, не тот уровень как бы, кроме того Indy может буферизировать ...
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 22
27.12.2013, 17:36  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну тут нет пакетов, не тот уровень как бы, кроме того Indy может буферизировать ...
т.е нет пакетов?
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (ms->Position < ms->Size)
   {
 
      k++;
     DWORD size = (ms->Size - ms->Position > 8192) ? 8192 : ms->Size - ms->Position;
     ms->ReadBuffer(&buf, size);
     TByteDynArray buff;
     buff.Length = 0;
     buff = RawToBytes(&buf, sizeof(buf));
     IdUDPClient3->SendBuffer(buff);  // отправляем поток
     Application->ProcessMessages();
   }
вот тут шлются пакеты размером по 8192
просто в лого выводится 6, т.е 6 раз были отправлены пакеты 5 раз по 8192 и 1 раз то что осталось
У меня есть более удобная заготовка для отправки пакетов, там где указывается и номер пакет и т.д. Но сперва нужно с этим разобраться. Я так понимаю у меня проблема со стороны приема и сохранения в файл. Помогите кто чем может...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.12.2013, 20:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (ms->Position < ms->Size)
   {
 
      k++;
     DWORD size = (ms->Size - ms->Position > 8192) ? 8192 : ms->Size - ms->Position;
     ms->ReadBuffer(&buf, size);
     TByteDynArray buff;
     buff.Length = 0;
     buff = RawToBytes(&buf, sizeof(buf));
     IdUDPClient3->SendBuffer(buff);  // отправляем поток
     Application->ProcessMessages();
   }
Прдон, а что это за ерунда ?
Я же изначально говорил что принимать надо столько сколько передали (т.е из первого полученного сообщения извлекать размер файла)
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
22.07.2015, 00:14
Господа, что за каша? Я так и не постиг как отправлять/принимать файлы/строки. Прошу плясните на работающем примере. Есть у меня opendialog/savedialog, А так же Indy UDP Server/client. Дайте хоть линк на пример. С TCP Socket-ами разобрался куда быстрее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2015, 00:14

Связь через IdUDPClient/Server
Всем доброго времени суток. Не так давно начал писать онлайн игру, для связи клиента и сервера использую Indy компоненты IdUDPClient и...

Отправка файлов через UDP
Всем привет. задача такая клиент зная IP сервера должен отправлять ему строку. как реализовать ? есть такой код: Клиент - ...

Отправка файлов через ajax
отправляю через форму файл. в обработчик формы он уже не попадает. подскажите, что не так. &lt;form id=&quot;mail_form10&quot;...

Отправка файлов через PhpMailer
Здравствуйте. Никак не могу понять как реализовать отправку файла через PhpMailer. Надо, чтобы в php создавался файл с данными и потом...

Отправка файлов через скрытый iframe
Здравствуйте, реализую отправку файлов через скрытый iframe. Ответ с сервера приходит в виде JSON. Но он вставляется в body как обычный...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru