![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не понимаю - почему ошибка при копировании через ClientSocket?:( [D5, Win2k, WinXP]
TankMan © (2005-03-23 12:15:00)Посмотрел в FAQ про передачу файлов через client-server Socket вот что получилось:
{Процедура на ClientSocket}
var sFile:TFileStream;
begin
sFile:=TFileStream.Create(eFileName.text,fmOpenReadWrite);
csClient.Socket.SendText('@-'+Edit2.text+'-@#-'+inttostr(sFile.Size)+'-#');
csClient.Socket.SendStream(sFile);
sleep(100);
sFile.Free;
csClient.Close;
{Прием на ServerSocket}
procedure TForm1.ssServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var command,param:string;
l: DWORD;
buf: PChar;
src: TFileStream;
begin
if ReceiveFile then
begin
l := Socket.ReceiveLength;
GetMem(buf,l+1);
Socket.ReceiveBuf(buf,l);
if not fileExists(ExtractFilePath(ParamStr(0))+'vot.upd') then
src:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'vot.upd',fmCreate)
else src:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'vot.upd',fmOpenReadWrite);
src.Seek(0,soFromEnd);
src.WriteBuffer(buf,l);
FreeMem(buf);
Application.ProcessMessages;
src.Free;
LenghtofFile:=LenghtofFile-l;
if LenghtofFile=0 then begin ReceiveFile:=false;ShowMessage('File is received');end;
exit;
end; // }
if ExtractParamCommand(Socket.ReceiveText,command,param) then
Memo1.Lines.Add(Socket.RemoteAddress+':'+Command+' - '+Param)
else Memo1.Lines.Add(Socket.RemoteAddress+':'+Param);
if command='update' then begin ReceiveFile:=true; LenghtofFile:=strtoint(Param);end; //}
Вобщем суть такова - клиент в начале посылает строку с коммандой и параметром а сервер приняв комманду, узнает не update-ли это, и если так то (как я задумал :) ) начинает прием файла...
Но тут то и проблема, почему-то выбрав файл в клиенте , я нажав отправить на строке
csClient.Socket.SendStream(sFile);
Выдается ошибка stack overflow, или так же выдавалась ошибка EPrivilege :(, я бы понял, если бы я был не под администратором, но почемуж он выдает ошибку :( не понимаю :(
Ах да забыл сказать, для удобства и клиент и сервер находится на одном компе на клиенте стоит Address:='127.0.0.1', соединяется нормально...
Может кто знает более надежный/удобный способ/алгоритм передачи через socket?
TankMan (2005-03-23 12:17:00) [21]И еще забыл сказать, что на строке
FreeMem(buf);
В процедуре приема данных почему-то выдается ошибка access violation, хотя GetMem выдает положительный результат :(