Текущий архив: 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