Главная страница
    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.45 MB
Время: 0.037 c
15-1190103143
Jeer
2007-09-18 12:12
2007.10.14
Кому нужен BlackFish SQL (риторический вопрос)


3-1181030273
alex_***
2007-06-05 11:57
2007.10.14
Как на оракле будет выглядеть этот запрос


2-1189904390
Gringoire
2007-09-16 04:59
2007.10.14
StringGrid


2-1190027016
DevilDevil
2007-09-17 15:03
2007.10.14
Открыто ли модальное окно?


15-1189652057
Slider007
2007-09-13 06:54
2007.10.14
С днем рождения ! 13 сентября 2007 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский