Главная страница
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.022 c
2-1190022039
Владимир_А
2007-09-17 13:40
2007.10.14
file


2-1189747819
artem779
2007-09-14 09:30
2007.10.14
как подключить модуль?


3-1181297041
ValeXandr
2007-06-08 14:04
2007.10.14
Работа с QReport


2-1189746770
APXi
2007-09-14 09:12
2007.10.14
Как определить какая форма активна, если все формы внедрены?


15-1189675794
Ega23
2007-09-13 13:29
2007.10.14
Как иконку компоненту добавить?