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

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

Не пойму где ошибка(сокеты)...


Страницы:   1 2

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#" ему не пришло.


Страницы:   1 2

Наверх

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