Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

не могу передать файл через TServerSocket [D7, XP]


Страницы:   1 2

KyRo ©   (2006-11-17 17:20:00) 

Мне нужно в не блокирующем режиме передать файл .
И у меня постоянно выскакивает ошибка от того что переодически приходит пустая строка,а когда ошибки нет то размер послаемых данных не совподает с размером полученых.

Как исправить такую сетуацию ?

Вот код сервера и то как я посылаю файл

var
  ms:TMemoryStream;
begin
  // Клиент получает команду на передачу файла.
 if Socket.ReceiveText = 'ldimg' then
 begin
   ms:= TMemoryStream.Create;
   try
     // Получаем данные на передачу.
     ms.LoadFromFile(ExtractFilePath(Application.ExeName)+'Img\'+Nomer+'.cab');
     ms.Position:= 0;
     // Добавляем длину данных, чтобы клиент знал,
     // сколько данных будет передано
     // Добавляем #0 , чтобы можно было определить,
     // где заканчивается информация о размере.
     Socket.SendText(IntToStr(ms.Size) + #0);
     // Посылаем его.
     Socket.SendStream(ms);
   except
     // Итак, осталось освободить поток, если что-то не так.
     ms.Free;
   end;
   Serverimg.Active:=False;


Вот код клиента и то как я принимаю и сохраняю файл
s, sl: string;
begin
 s:= Socket.ReceiveText;
 // Если мы не в режиме приёма:
 if Rec <> 5 then
 begin
   Rec := 5;
   // Теперь нам необходимо получить длину потока данных.
   SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
   StrLCopy(@sl[1], PChar(s), Length(sl)-1);
   DataSize:= StrToInt(sl);
   Data:= TMemoryStream.Create;
   // Удаляем информацию о размере из данных.
   Delete(s, 1, Length(sl));
 end;
 // Сохраняем данные в файл, до тех пор, пока не получим все данные.
 try
   Data.write(s[1], length(s));
   if Data.Size = DataSize then
   begin
     Data.Position:= 0;
     Data.SaveToFile('c:\img.cab');
     Data.Free;
     Rec:= 6;
     Socket.Close;
   end;
 except
   Data.Free;


MikePetrichenko   (2006-11-17 19:19:00) [21]

"Объясняю популярно" (С) Высоцкий

У сокетов есть внутренний буфер. И он совершенно не обязан совпадать с размером твоего файла или размером передаваемых данных.
Пакеты погут склеится а могут и не склеится. Может придни вместо одного пакета 10 мелкий.
Учи мат часть по сокетам.


oldman   (2006-11-17 19:15:00) [22]


> И у меня постоянно выскакивает ошибка от того что переодически
> приходит пустая строка,а когда ошибки нет то размер послаемых
> данных не совподает с размером полученых.


активно ищем ошибку в коде.
она есть.
но мне ее искать как-то недосуг. уж извините...


Dmitrij_K   (2006-11-17 19:13:00) [23]

Отладчик тебе на что?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо