Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.04 c
15-1189884398
syte_ser78
2007-09-15 23:26
2007.10.14
bde + vista


1-1185737196
oxffff
2007-07-29 23:26
2007.10.14
Очередной баг или так и задумано


15-1189682335
de.
2007-09-13 15:18
2007.10.14
С ++


6-1171471733
alexm_hs
2007-02-14 19:48
2007.10.14
Отправка RARP-пакета (Send RARP).


2-1189678304
molodoi
2007-09-13 14:11
2007.10.14
Вычисляемое поле в DBLookUpComboBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский