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'" pos stronie servera.
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