![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не пойму где ошибка(сокеты)...
Sergl © (2007-11-01 10:05:00)Передаю файл через сокеты.
На сервере:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var ms:tmemorystream;
begin
if serversocket1.Socket.Connections[0].ReceiveText='get_file' then begin
showmessage('file------');
ms:= TMemoryStream.Create;
try
// Получаем данные на передачу.
ms.LoadFromFile(PChar(maskedit1.Text));
ms.Position:= 0;
// Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
// Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
Socket.SendText(IntToStr(ms.Size) + #0);
// Посылаем его.
Socket.SendStream(ms);
socket.SendText('#end_file#');
except
// Итак, осталось освободить поток, если что-то не так.
ms.Free;
end;
end;
end;
на кленте:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var s, sl: string;
prov:bool;
begin
s:= Socket.ReceiveText;
// Если мы не в режиме приёма:
if not Reciving then
begin
// Теперь нам необходимо получить длину потока данных.
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));
Reciving:= true;
end;
// Сохраняем данные в файл, до тех пор, пока не получим все данные.
if copy(s,length(s)-9,10)='#end_file#' then begin
// showmessage('Ура');
prov:=true;
// Delete(s,length(s)-9,10);
end;
if s<>'#end_file#' then prov:=false;
try
if prov=false then Data.Write(s[1], length(s));
if prov=true then begin
if Data.Size = DataSize then
begin
Data.Position:= 0;
data.SaveToFile('c:\000.jpg');
Data.Free;
Reciving:= false;
// Socket.Close;
showmessage('Файл принят');
end else showmessage('Файл принят не удачно');
end;
except
Data.Free;
end;
end;
Данные клиент получает, но не читает что ему пришло "#end_file#". Почему?
Slym (2007-11-01 11:04:00) [21]Sergl (01.11.07 10:05)
Данные клиент получает, но не читает что ему пришло "#end_file#". Почему?
Объясняю:
Socket.SendStream(ms); - послал только одну "пачку" данных до возникновения WOULBLOCK и вышел
socket.SendText('#end_file#');
посылаешь маркер конца файла, но файл фактически не отправлен... т.к. оставшиеся "пачки" Stream досылаются по мере освобождения отправляющего буфера
Sergl (2007-11-01 11:04:00) [22]
> На лицо работа с неблокирующими сокетами в блокирующей манере.
> .. непалучедся
Подкинте пожалуйста литературу(ссылок) про работа с блокированием и не блокированием.
Slym (2007-11-01 10:59:00) [23]// Итак, осталось освободить поток, если что-то не так - не нужно
На лицо работа с неблокирующими сокетами в блокирующей манере... непалучедся :)
Sergl (2007-11-01 10:46:00) [24]Как сделать что-бы ему это пришло?
Сергей М. (2007-11-01 10:43:00) [25]
> не читает что ему пришло "#end_file#". Почему?
Потому что "#end_file#" ему не пришло.