🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
1 messages
1 total messages Started by sebo Wed, 31 Aug 2011 09:12
Delphi + Lazarus
#72292
Author: sebo
Date: Wed, 31 Aug 2011 09:12
111 lines
4149 bytes
Witam!
Nie dawno zacząłem się uczyć gniazd. (Indy 10 komponenty TIdTcpClient i 
TIdTcpServer ). Moim zamierzeniem jest zrobienie aplikacji serwerowej, z tym 
że pod Linuxem, zatem w linuxie pisze w Lazarusie. Kody które działały pod 
windowsami (Delphi) nie chcą działać pod lazarusem. Może ktoś robił podobną 
rzecz i będzie w stanie mi pomóc lub użyczyć kodu. Mój kod prezentuje się 
następująco. Dodam tylko że, raz się, łączy raz nie a raz wywala błąd o 
treści "raised exception class 'External: SIGSEGV'"

Kod
Po stronie Clienta:

Function TSocketF.WyslijSocketem(PlikISciezka:string):integer;
var
fileStream: TFileStream;
ch:integer;
begin
ch:=0;
PolaczZServerem();

fileStream := TFileStream.Create(PlikISciezka, fmOpenRead or fmShareDenyWrite);
try
  try
  USocket.SocketF.Client.IOHandler.writeln('SFILE');
  USocket.SocketF.Client.IOHandler.writeln(ExtractFilename(PlikISciezka));
  USocket.SocketF.Client.IOHandler.LargeStream:=true;
  Filestream.Position:=0;
  USocket.SocketF.Client.IOHandler.Write(filestream,filestream.Size,true);

  finally
  FreeAndNil(FileStream);
  end;

 except
 on E:Exception do
 begin
 glowny.ostrzezenie('Błąd wysyłania pliku');
 ch:=1;
 end;
 end;

 WyslijSocketem:=ch;
 end;

Procedure PolaczZServerem();
begin
try
//if USocket.SocketF.Client.Connected=true then
   USocket.SocketF.Client.Disconnect;
   USocket.SocketF.Client.IOHandler.Free;

   USocket.SocketF.Client.Host:=glowny.DaneFirmy(1).SERWER_HOST;
   USocket.SocketF.Client.Port:=glowny.DaneFirmy(1).SERWER_PORT;
   //USocket.SocketF.IdSSLIOHandlerSocketOpenSSL1.PassThrough:=false;

   USocket.SocketF.Client.Connect;
except
glowny.ostrzezenie('Problem z nawiązaniem połączenia z serwerem PBaza');
end;
end;


PO STRONIE SERVERA

procedure TSocketF.ServerExecute(AContext: TIdContext);
var
Akcja,NazwaPliku,Katalog:string;
FileStream:TFileStream;
begin
  if not USocket.SocketF.Server.Active then
  begin
    USocket.SocketF.server.Active := true;
  end;
    Katalog:=ExtractFilePath(Application.ExeName)+'Pliki\';
 while AContext.Connection.Connected do
begin
try
  Akcja:=AContext.Connection.IOHandler.ReadLn;
      if Akcja='SFILE' then
      begin
      NazwaPliku:=AContext.Connection.IOHandler.ReadLn;
      FileStream := TFileStream.Create(Katalog+NazwaPliku, fmCreate);
      AContext.Connection.IOHandler.LargeStream:=true;
      AContext.Connection.IOHandler.ReadStream(FileStream, -1, False);
      end;

      if Akcja='GFILE' then
      begin
      NazwaPliku:=AContext.Connection.IOHandler.ReadLn;
      fileStream := TFileStream.Create(Katalog+NazwaPliku, fmOpenReadWrite);
      AContext.Connection.IOHandler.LargeStream:=true;
      Filestream.Position:=0;
      AContext.Connection.IOHandler.Write(filestream,filestream.Size,true)
      end;

finally
FreeAndNil(FileStream);
end;
AContext.Connection.Disconnect;


end;
Memo1.Lines.Add('Połączenie od: '+AContext.Connection.Socket.Binding.PeerIP 
+' ; o godzinie: '+timetostr(now)+' ; Akcja: '+Akcja);
end;

Dodałem dodatkowo do komponentu IdTcpServer Bindings 0.0.0.0 port 3500 ( bo na 
takim działam) i zaznaczyłem IPv4

-- 
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads