LNet Tutorial

Alle Fragen zur Netzwerkkommunikation
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: LNet Tutorial

Beitrag von Maik81ftl »

MAC hat geschrieben:Das sieht ziemlich richtig aus.
Das die Prozedure nicht aufgerufen wird scheint wohl daran zu liegen, das es zwar ein Server gibt, allerdings kein Client der darauf zugreift.
Oder gibt es auch noch eine Client-Komponente auf dem Formular (Server und Client ist technisch das gleiche, schmeis einfach noch ne 2te Komponente drauf die du dann mit den Server verbinden lässt...


Hab das Programm mal wie folgt abgeändert

Quelltext:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, lNetComponents, lNet;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Client: TLTCPComponent;
    IP: TLabeledEdit;
    Memo1: TMemo;
    Server: TLTCPComponent;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ClientConnect(aSocket: TLSocket);
    procedure ClientDisconnect(aSocket: TLSocket);
    procedure ClientError(const msg: string; aSocket: TLSocket);
    procedure ClientReceive(aSocket: TLSocket);
    procedure ServerAccept(aSocket: TLSocket);
    procedure ServerDisconnect(aSocket: TLSocket);
    procedure ServerError(const msg: string; aSocket: TLSocket);
    procedure ServerReceive(aSocket: TLSocket);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var Port: Integer;
    ServerIP: String;
    Verbindungsaufbau: Boolean;
begin
  Port := StrToInt(Edit1.Text);
  Verbindungsaufbau := Server.Listen(Port);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Server.Disconnect(True);
  Memo1.Append('Server wurde Deaktiviert');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var sendetext : String;
begin
  sendetext := Edit1.text;
  if (sendetext <> ' ') then
     Server.SendMessage(sendetext);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var Port : integer;
    ServerIP : String;
    Verbindungsaufbau : boolean;
begin
  Port := StrToInt(Edit1.Text);
  ServerIP := IP.Text;
  Verbindungsaufbau := Client.Connect(ServerIP,Port);
  if Verbindungsaufbau then
     Memo1.Append('Die Verbindung wird aufgebaut . . .');
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  client.Disconnect(true);
end;
 
procedure TForm1.ClientConnect(aSocket: TLSocket);
begin
  Memo1.append ('Verbindung zum Server mit der IP ' + aSocket.LocalAddress +' wurde hergestellt');
end;
 
procedure TForm1.ClientDisconnect(aSocket: TLSocket);
begin
  Memo1.append ('Verbindung zum Server wurde getrennt');
end;
 
procedure TForm1.ClientError(const msg: string; aSocket: TLSocket);
begin
  Memo1.Append('Fehlermeldung: ' + msg);
end;
 
procedure TForm1.ClientReceive(aSocket: TLSocket);
var Eingangstext : String;
begin
  aSocket.GetMessage(Eingangstext);
  Memo1.append ('Eingehende Nachricht: ' + Eingangstext);
end;
 
procedure TForm1.ServerAccept(aSocket: TLSocket);
begin
  Label1.Caption:= aSocket.LocalAddress;
  Memo1.Append('Verbindung Zum Client mit der IP: ' + aSocket.LocalAddress + ' wurde hergestellt');
end;
 
procedure TForm1.ServerDisconnect(aSocket: TLSocket);
begin
  Memo1.Append('Verbindung zum Client wurde getrennt.');
end;
 
procedure TForm1.ServerError(const msg: string; aSocket: TLSocket);
begin
  Memo1.Append('Fehlermeldung: ' + msg);
end;
 
procedure TForm1.ServerReceive(aSocket: TLSocket);
var Eingangstext: String;
begin
  aSocket.GetMessage(Eingangstext);
  Memo1.Append('Eingehende Nachricht: ' + Eingangstext);
end;
 
end.


lfm-file

Code: Alles auswählen

object Form1: TForm1
  Left = 445
  Height = 297
  Top = 225
  Width = 304
  Caption = 'Form1'
  ClientHeight = 297
  ClientWidth = 304
  LCLVersion = '0.9.31'
  object Label1: TLabel
    Left = 10
    Height = 18
    Top = 10
    Width = 27
    Caption = 'Port'
    ParentColor = False
  end
  object Edit1: TEdit
    Left = 10
    Height = 27
    Top = 32
    Width = 126
    TabOrder = 0
    Text = '5000'
  end
  object Button1: TButton
    Left = 10
    Height = 29
    Hint = 'Auch Client verbinden'
    Top = 96
    Width = 124
    AutoSize = True
    Caption = 'Server &aktivieren'
    OnClick = Button1Click
    ParentShowHint = False
    ShowHint = True
    TabOrder = 1
  end
  object Button2: TButton
    Left = 148
    Height = 29
    Top = 96
    Width = 140
    AutoSize = True
    Caption = 'Server &deaktivieren'
    OnClick = Button2Click
    TabOrder = 2
  end
  object Memo1: TMemo
    Left = 10
    Height = 120
    Top = 128
    Width = 278
    ScrollBars = ssAutoBoth
    TabOrder = 3
  end
  object Edit2: TEdit
    Left = 10
    Height = 27
    Top = 256
    Width = 179
    TabOrder = 4
    Text = 'Edit2'
  end
  object Button3: TButton
    Left = 229
    Height = 29
    Top = 256
    Width = 59
    AutoSize = True
    Caption = '&senden'
    OnClick = Button3Click
    TabOrder = 5
  end
  object IP: TLabeledEdit
    Left = 148
    Height = 27
    Top = 32
    Width = 140
    EditLabel.AnchorSideLeft.Control = IP
    EditLabel.AnchorSideRight.Control = IP
    EditLabel.AnchorSideRight.Side = asrBottom
    EditLabel.AnchorSideBottom.Control = IP
    EditLabel.Left = 148
    EditLabel.Height = 18
    EditLabel.Top = 11
    EditLabel.Width = 140
    EditLabel.Caption = 'IP'
    EditLabel.ParentColor = False
    TabOrder = 6
  end
  object Button4: TButton
    Left = 10
    Height = 29
    Top = 64
    Width = 77
    AutoSize = True
    Caption = '&Verbinden'
    OnClick = Button4Click
    TabOrder = 7
  end
  object Button5: TButton
    Left = 148
    Height = 29
    Top = 64
    Width = 63
    AutoSize = True
    Caption = '&Trennen'
    OnClick = Button5Click
    TabOrder = 8
  end
  object Server: TLTCPComponent
    Port = 0
    OnReceive = ServerReceive
    OnError = ServerError
    OnDisconnect = ServerDisconnect
    OnAccept = ServerAccept
    Timeout = 0
    ReuseAddress = True
    left = 176
    top = 160
  end
  object Client: TLTCPComponent
    Port = 0
    OnReceive = ClientReceive
    OnError = ClientError
    OnDisconnect = ClientDisconnect
    OnConnect = ClientConnect
    Timeout = 0
    ReuseAddress = False
    left = 136
    top = 160
  end
end
und bekam folgende Ausgabe.

Code: Alles auswählen

Die Verbindung wird aufgebaut . . .
Verbindung zum Server mit der IP 192.168.178.22 wurde hergestellt
Fehlermeldung: Error on bind [13]: Permission denied


verwendete Werte sind Port 23; IP 192.168.178.100

Werd ich wohl noch mal etwas rumbasteln müßen, da ich die Fehlermeldung mal so verstehe, das mein Leppi (IP: 192.168.178.22) nicht als Server laufen will.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: LNet Tutorial

Beitrag von MAC »

als allererstest lass server und client auf einem PC laufen.
dann verwende am besten als ip 127.0.0.1 , das ist immer lokal.
Weil wenn das Punktioniert weist du das dein Programm alles richtig macht.
Das andere wird durch Router Firewall ,.. beeinflusst...
ich schau gleich aber mal genau drüber...

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: LNet Tutorial

Beitrag von Maik81SE »

mit anderen worten ich soll statt nach einem Gerät erst mal nach dem eigenen rechner suchen???

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: LNet Tutorial

Beitrag von carli »

Maik81ftl hat geschrieben:

Code: Alles auswählen

Die Verbindung wird aufgebaut . . .
Verbindung zum Server mit der IP 192.168.178.22 wurde hergestellt
Fehlermeldung: Error on bind [13]: Permission denied


Ports unter 1024 sind festen Diensten zugeordnet und können somit nur mit Sonderrechten des Betriebssystems (einfachste Variante: Root-Rechte garantieren) benutzt werden.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: LNet Tutorial

Beitrag von Maik81ftl »

carli hat geschrieben:
Maik81ftl hat geschrieben:

Code: Alles auswählen

Die Verbindung wird aufgebaut . . .
Verbindung zum Server mit der IP 192.168.178.22 wurde hergestellt
Fehlermeldung: Error on bind [13]: Permission denied


Ports unter 1024 sind festen Diensten zugeordnet und können somit nur mit Sonderrechten des Betriebssystems (einfachste Variante: Root-Rechte garantieren) benutzt werden.


erstaunt mich dabei nur, das ich über einen andere Anwendung meine Netzgeräte via Ethernet auf 192.168.178.100 und Port 23 schalten, einrichten und steuern kann wie mir lustig ist.

wenn ich das aber wie du sagst via 127.0.0.1 bzw localhost in dieser Anwendung mache, erhalte ich erst mal folgende Zeilen:

Code: Alles auswählen

Die Verbindung wird aufgebaut . . .
Verbindung Zum Client mit der IP: 127.0.0.1 wurde hergestellt
Verbindung zum Server mit der IP 127.0.0.1 wurde hergestellt
Vermute mal wirklich, das ich auf z.B. dem IPS von ELV nur via clinet zugreifen kann, da da das Post 23 freigegeben ist.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: LNet Tutorial

Beitrag von arturx »

Hallo Martin,
zunächst vielen Dank für das Tutorial. Es hat mir einen sehr komfortablen Einstieg mit Lnet gebracht. :D
Beim Quelltext der individualisierten Ansprache durch den Server ist mir Folgendes aufgefallen,
was Du m.E. im Tutorial ändern solltest :
1.Seite 6

Code: Alles auswählen

procedure TForm1.Button4Click(Sender: TObject);
         begin ....
                server.IterReset;
               while server.IterNext do
                      begin  //Memo1.Append(Server.Iterator.PeerAddress); <-- Original
                                  Memo1.Append(Server.Iterator.localaddress);   // <-- Änderung
                                ...

2.

Code: Alles auswählen

procedure TForm1.Memo1DblClick(Sender: TObject);
var ClientIP : String;
begin
ClientIP := Memo1.seltext;
server.IterReset;
while server.IterNext do
//if (ClientIP = server.Iterator.PeerAddress) then <-- Original
  if (ClientIP = server.Iterator.localaddress) then // <-- Änderung
      server.SendMessage('Testnachricht',Server.Iterator);
end;

3.Vielleicht solltest Du noch erwähnen, wie die Server-IP auf das Serverformular kommt...
 
Nochmals, vielen Dank für das tolle Tutorial !
Rainer

joe
Beiträge: 37
Registriert: Fr 28. Mai 2010, 15:47

Re: LNet Tutorial

Beitrag von joe »

Hallo Martin,

vielen herzlichen Dank für das tolle Tutorial. Das hat mir sehr geholfen, eine Tcp Verbindung mit Lazarus zu realisieren.
Ich habe das jetzt mal erfolgreich durchgearbeitet mit:
* Lazarus 1.0.4
* lNet 0.6.5
* unter Linux (Kubuntu 12.04)

Kleine Anmerkungen dazu:


Installation des lNet Package

Bei der Installation des lNet Package bekam ich u.a. die Meldung »Wollen Sie Lazarus jetzt neu kompilieren?«
Ok, ich hab' das einfach mal mutig bestätigt und das Kompilieren dauerte nicht wirklich lange.
Lazarus startete sich neu und die lNet Komponenten waren vorhanden.

Was mich aber schon etwas verwunderte:
* Das Lazarus hatte ich als Debian-Paket gezogen und bei mir über die Paketverwaltung installiert
* Folglich landete Lazarus unter /usr/share/lazarus/1.0.4
* Wenn ich mit Lazarus arbeite, dann nicht als root
* Es hätte mich also schon gewundert, wenn sich durch die Installation des Package irgendwas unterhalb von /usr/share/lazarus/1.0.4 geändert hätte

Und siehe da:
* das neu kompilierte Lazarus liegt in ~/.lazarus (für mich eine neue Erkenntnis)
* wenn ich lNet verwenden möchte, muss ich jetzt immer das dort abgelegte Lazarus Binary starten, weil
* starte ich wie gewohnt Lazarus aus /usr/share/lazarus/1.0.4 dann habe ich kein lNet

Hmm, muss ich das Package als root installieren damit das neue Lazarus Binary (und was sonst noch so bei Neukompilieren entsteht) in /usr/share/lazarus/1.0.4 landet?


Server-Beispiel

Das Server-Beispiel (http://www.martinjakobs.de/modules/down ... hp?file=68) lässt sich unter Linux nur übersetzen, wenn man »uses Winsock« und diverses aus »TForm1.FormCreate« entfernt.


Gruss, Joe

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: LNet Tutorial

Beitrag von mintpc »

Hallo,

ich hab die Fehler in den Beispielen soweit behoben und {$IFDEF Windows} an den
entsprechenden Stellen, wie die IP ausgelesen wird, ergänzt.

Sollte nun funktionieren, falls nicht, benachrichtigt mich bitte.

mintpc

JDelphi
Beiträge: 1
Registriert: Sa 9. Dez 2017, 17:47

Re: LNet Tutorial

Beitrag von JDelphi »

Schade, leider ist es Offline. Hat vlt. noch jemand den letzten stand, und könnte ihn anderswo veröffentlichen.

relocate
Beiträge: 61
Registriert: Di 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
CPU-Target: 32Bit

Re: LNet Tutorial

Beitrag von relocate »

JDelphi hat geschrieben:
Mi 27. Mai 2020, 10:54
Schade, leider ist es Offline. Hat vlt. noch jemand den letzten stand, und könnte ihn anderswo veröffentlichen.
https://web.archive.org/web/2019*/http://www.martinjakobs.de/pages/lazarus.php
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.

Aber das wäre langweilig.

relocate
Beiträge: 61
Registriert: Di 24. Jan 2012, 11:47
OS, Lazarus, FPC: Win (L- FPC 2.4.4 + 2.6.4)
CPU-Target: 32Bit

Re: LNet Tutorial

Beitrag von relocate »

Sorry, habe den Link gerade noch einmal gecheckt, die eigentliche PDF hat archive.org wohl leider nicht gesichert.
Würde ich die Dinge so wie alle anderen machen, hätte ich so manche Probleme nicht.

Aber das wäre langweilig.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: LNet Tutorial

Beitrag von af0815 »

Deswegen nicht gesichert, weil die sich hinter eine php Downloadscript versteckt gehalten haben. Vielleicht den Siteowner mal anschreiben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LNet Tutorial

Beitrag von sstvmaster »

Naja die Seite gibt es ja noch, du kannst ihm ja mal ne Mail schreiben und nett Bitten ob er das noch hat und zur Verfügung stellen kann/möchte.

http://www.martinjakobs.de/

Edit:
Andy hatte die gleiche Idee.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: LNet Tutorial

Beitrag von mintpc »

Ups!

Da ich mittlerweile nach https://memoone.de umgezogen, bin laufen im Augenblick nur Corona-Fernunterricht-Erklärvideos auf der alten Seite.
Das LNet-PDF hab ich hier angehängt. Viele Grüße

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LNet Tutorial

Beitrag von sstvmaster »

Danke Martin das du das Dokument noch mal zur Verfügung gestellt hast.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Antworten