![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не могу передать файл через TServerSocket [D7, XP]
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]Отладчик тебе на что?