![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket, одновременная передача файлов клиентами [D3, Win2k]
ovb68 © (2007-02-16 17:31:00)День добрый,
может что мне подскажите.
Я пишу клиент-сервер в основном для передачи файлов, довольно больших
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:00) [1]
> При одновременной передачи файлов, если первый клиент передает
> а в это время
> начинает передавать файл второй клиент то
> у первого все замирает, а второй успешно передает файл.
ovb68перейди на блокирующий режим и вынеси прием файлов сервером в отдельные потоки.