Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

ServerSocket, одновременная передача файлов клиентами   Найти похожие ветки 

 
ovb68   (2007-02-16 17:31) [0]

День добрый,
может что мне подскажите.
Я пишу клиент-сервер в основном для передачи файлов, довольно больших
700-900Mb.
Так вот для одного клиента все ОК. А вот уже с двумя начинаются траблы.
При одновременной передачи файлов, если первый клиент передает а в это время
начинает передавать файл второй клиент то
у первого все замирает, а второй успешно передает файл.

часть код сервера
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
 New(DataForSocket);
 DataForSocket^.FileName:= "";
 DataForSocket^.ReseveTxt:= False;
 DataForSocket^.Data:= False;
 DataForSocket^.TimeConnect:= TimeToStr(Time);
 Socket.Data:= DataForSocket;
 memo1.Lines.Add("Conect has done");
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
 PrtForData: ^TDataForSocket;
 b: array[0..8192] of char;
 rb:integer;
 wb:dword;
 i:integer;
begin
PrtForData:= Socket.Data;
if (not PrtForData^.Data) and (not PrtForData^.ReseveTxt) then
 begin
   PrtForData^.FileName:=Socket.ReceiveText;
   PrtForData^.FN:= PrtForData^.FileName + ".new";
   PrtForData^.ReseveTxt:= True;
   Socket.SendText("size");
 end
else
 if (not PrtForData^.Data) and (PrtForData^.ReseveTxt) then begin
   rb:=Socket.ReceiveLength;
   if rb >= sizeof(PrtForData^.FS2) then begin
       Socket.ReceiveBuf(PrtForData^.FS2,sizeof(PrtForData^.FS2));
       PrtForData^.MaxValue:=integer(PrtForData^.FS2);
       PrtForData^.Progress:=0;
       PrtForData^.Data:=true;
       if PrtForData^.FS2 > 0 then begin
          PrtForData^.M2:=CreateFile(PChar(PrtForData^.FN),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
          if PrtForData^.M2 <> INVALID_HANDLE_VALUE then Socket.SendText("Ok") ;
       end
   end
 end
 else begin
  rb:=Socket.ReceiveBuf(b,sizeof(b));
  if rb > 0 then begin
    WriteFile(PrtForData^.M2,b,rb,wb,nil);
    PrtForData^.Progress:=PrtForData^.Progress + rb;
    if PrtForData^.Progress=PrtForData^.MaxValue then begin
      PrtForData^.Data:=false;
      PrtForData^.ReseveTxt:=false;
      CloseHandle(PrtForData^.M2);
      PrtForData^.Progress:=0;
      Socket.SendText("end");
    end
    else Socket.SendText("Ok");
  end;
 end;
end;

Олег.


 
medved_68 ©   (2007-02-16 17:38) [1]


> При одновременной передачи файлов, если первый клиент передает
> а в это время
> начинает передавать файл второй клиент то
> у первого все замирает, а второй успешно передает файл.

ovb68 перейди на блокирующий режим и вынеси прием файлов сервером в отдельные потоки.



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.028 c
15-1190095040
de.
2007-09-18 09:57
2007.10.14
Среды разработки под FreeBSD


2-1190561097
zlow_andr
2007-09-23 19:24
2007.10.14
THashedStringList?


15-1189596497
FreeTT
2007-09-12 15:28
2007.10.14
Добавление группы в TRZBarGroup


15-1189774018
Василий
2007-09-14 16:46
2007.10.14
Розыскивается bzlib для D7


2-1190016964
Kolan
2007-09-17 12:16
2007.10.14
Exception в TObjectList при Add, из-за чего может быть?