انا اعمل علي برنامج لينقل الملفات من كلينت لسيرفر لكلينت
ولكن الان اعمل علي مثال بسيط فقط وهو النقل من كلينت لسيرفر وحفظ الملف في السيرفر
ولكن عندي مشكله الا وهي انا اذا ارسلت اكتر من ملف اخر ملف فقط هو الذي يصل كاملا اما الباقي فلا يكتمل ولا اعرف ما السبب مع اني لو ارسلت ملف واحد فقط يصل كامل و سليم
type TMASTER = record used:bool; sock: integer; fs: tfilestream; NAME_FILE:STRING; fSIZE:INTEGER; end;
اولا صنعت ريكود ليحتوي بعض المعلومات مثل اسم الملف وحجمه ووضعت متغير في البدايه لكي اعرف اذا كان هذا الريكورد مستخدم ام لا
متغير من نوع انتجر ليخزن السوكت هاندل
فايل ستريم استريم ليكتب في الملف
سترنج للاسم و انتجر للحجم
sr_file: array [0..5]of TMASTER;
هنا صنعت مصفوفه من الريكورد
procedure TForm2.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf:string;
MsgLen,
ReceiveLen
,n,i ,sockhand
:integer;
// bSkip: boolean;
label
streamcreation;
begin
sockhand:=Socket.SocketHandle;
MsgLen:=Socket.ReceiveLength;
SetLength(buf,MsgLen);
ReceiveLen:=Socket.ReceiveBuf(buf[1],MsgLen);
buf:=copy(buf,1,ReceiveLen);
if pos('<FILEONWAY>',buf) = 1 then
begin
delete(buf,1,11);
NAME_FILE:=copy(buf,1,pos('|',buf)-1);
delete(buf,1,pos('|',buf));
fSIZE:=STRTOINT(copy(buf,1,pos('|',buf)-1));
delete(buf,1,pos('|',buf));
Updatetrans(Socket.RemoteAddress, inttostr(sockhand),NAME_FILE,INTTOSTR(fSIZE),0);
Memo1.Lines.Add(buf);
for n :=0 to 5 do
if sr_file[n].used = false then goto streamcreation else begin showmessage('to many streams'); exit; end;
streamcreation:
begin
sr_file[n].sock:=sockhand;
sr_file[n].Fs:=TFileStream.Create(ExtractFileName(NAME_FILE),fmcreAte or fmOpenWrite);
sr_file[n].NAME_FILE:=ExtractFileName(NAME_FILE);
sr_file[n].fSIZE:=fSIZE;
end;
end;
Memo1.Lines.Add(buf+inttostr(length(Buf)));
try
for i :=0 to 5 do
if sr_file.sock =sockhand then
begin
Updatetrans(Socket.RemoteAddress, inttostr(sockhand),'','',length(buf));
sr_file.FS.Write(Buf[1], length(Buf)); {4}
dec(sr_file.fSize,length(buf));
if sr_file.fSIZE =0 then
begin
sr_file.used:=false;
sr_file.sock:=0;
sr_file.fs.Free;
sr_file.NAME_FILE:='';
sr_file.fSIZE:=0;
end;
end;
except
Memo1.Lines.Add('Error writing file.'); end;
end;هناك 2loop
واحده لتجد ريكورد خالي ليضع فيه البيانات
والثانيه لكي يجد الريكورد المطلوب و الذي كون مسبقا عند ارسال البيانات من سوكت معينه