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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2012, 18:04   #1
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию Winsock. Передача файла.

Доброго времени суток, уважаемые.

Долго ломал себе голову над одним вопросом, и в итоге решил обратиться к знатокам на данном форуме.

Проблема следующая:

Имеются две программы: клиент и сервер. Сервер делает выборку из БД, сохраняет результаты в xls и пересылает эти результаты подключенному клиенту. Выборка работает нормально и все замечательно сохраняется. А вот когда дело доходит до пересылки полученного файла клиенту, у этого клиента в файл пишется какая-то непонятная абракадабра.

Вот код обработки принятых данных от клиента:

Код:
buf2: array[1..1000] of AnsiChar;
DataSize:integer;
Data1:TMemoryStream;
WaitingForFile,WaitingForLength:boolean;

  //если программа отправила запрос на выборку и ожидает ответа, то начинаем процесс приема файла
      If WaitingForFile=true then
      begin
 // для начала принимаем информацию о размере стрима (работает)
       if WaitingForLength=true then
       begin
        Form1.DataSize:=strtoint(buf2);
        Data1:=TMemoryStream.Create;
//размер стрима сохранен, теперь можно принимать сам стрим
        WaitingForLength:=False;
       end else
       begin
        try
         Data1.Writebuffer(buf2,sizeof(buf2));
//если все приняли,то...
         If Data1.Size=Form1.DataSize then
         begin
          Data1.Position:=0;
//...сохраняем файл
          Form1.SaveDialog1.Filename:='Temp.xls';
          If Form1.SaveDialog1.Execute then Data1.SaveToFile(Form1.SaveDialog1.FileName);
          Data1.Free;
          WaitingForFile:=false;
          WaitingForLength:=false;
         end;
        except
         Data1.Free;
        end;
       end;
Код отправки файла с сервера:

Код:
  TClient = record
   SocketID:integer;
   SocketPos:byte;
   IP:string;
   Data:TMemoryStream;
   DataSize:integer;
   SendText:string;
   RecvText:string;
   Query: TOraQuery;
   FileExport: TXLSExportFile;
   DBExport: TXLSExportDBGrid;
  end;


Data1:=TMemorystream.Create;

//сначала экспортируем результаты в файл
  Client1.FileExport.SaveToFile('\data\Temp.xls');
//загружаем файл в поток
  Client1.Data.LoadFromFile('\data\Temp.xls');
//устанавливаем позицию в начало
  Client1.Data.Position:=0;
//записываем размер стрима
  Client1.DataSize:=Sizeof(Client1.Data);

//преобразования для отсылки размера стрима клиенту
  y:=Client1.Data.Size;
  temp1:=inttostr(y);
  y:=Length(temp1);

//помещаем в буфер информацию о размере
  zeromemory(@buf1,sizeof(buf1));
  for t:=1 to y do
  begin
   buf1[t]:=temp1[t];
  end;

  try
//отправляем размер передаваемого стрима
  Send(Client1.SocketID,buf1,sizeof(buf1),0);
//отправляем сам стрим (наверняка я тут и накосячил)
  Send(Client1.SocketID,Client1.Data,Client1.Data.Size,0);
 Client1.Data.Free
  except Client1.Data.Free;
  end;
В итоге, как я и говорил, в файл пишется непонятная чушь.

Прошу помощи. Мой мозг уже на грани взрыва)

П.С.: юзаю Winsock. Готовые компоненты вроде TServerSocket и TClientSocket не использую.

Вот как-то так.
Recart вне форума Ответить с цитированием
Старый 04.10.2012, 21:12   #2
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Кошмарный код. Ошибка на ошибке.
Абсолютное непонимание даже Delphi-азов.

Начни "разбор полетов" вот с этой несуразицы:

Цитата:
//записываем размер стрима
Client1.DataSize:=Sizeof(Client1.Da ta);
xoodoo вне форума Ответить с цитированием
Старый 04.10.2012, 23:55   #3
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Цитата:
Сообщение от xoodoo Посмотреть сообщение
Кошмарный код. Ошибка на ошибке.
Сам ужасаюсь)

Цитата:
Сообщение от xoodoo Посмотреть сообщение
Абсолютное непонимание даже Delphi-азов.
Ну я бы не стал делать таких выводов только по этому коду.

С передачей данных дел имел мало, поэтому насобирал понемногу из того, что находил гугл. А находил он мало, т.к. все пишут уже с готовыми компонентами.

Со всем остальным проблем нет.
Recart вне форума Ответить с цитированием
Старый 05.10.2012, 11:22   #4
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
Сообщение от Recart Посмотреть сообщение
С передачей данных дел имел мало
Со всем остальным проблем нет.
Передача данных тут вообще ни причем.
Проблемы как раз с "остальным": псевдофункция SizeOf() не имеет ни малейшего отношения к размеру данных в стриме.
xoodoo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закачка файла на WinSock t2skler Общие вопросы Delphi 14 19.11.2018 11:54
winSock передача файла Dizelektwo Общие вопросы C/C++ 8 27.04.2012 20:26
Передача файла по сети (winsock) lol48 Фриланс 8 08.06.2011 21:44
передача данных на Winsock megostudent Win Api 5 23.03.2011 17:35