LNet TLSocket indentifiziertbar durch ip + Port ?

Alle Fragen zur Netzwerkkommunikation
Antworten
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

LNet TLSocket indentifiziertbar durch ip + Port ?

Beitrag von MAC »

Hallo,

ich versuche mit Hilfe von LNet die Lokale IP + Lokalen Port und die Peer IP + Peer Port auszulesen.
Dabei bekommt ich zwar auch Werte, aber kann ich damit nicht allzu viel anfangen, weil diese Funktionen meiner Meinung nach nicht die "Richtigen" Werte liefern.

Hintergrund(kann eigt. überflogen werden...):
Um Effizient Daten zu versenden, hab ich ein Kompliziertes Geflecht aus vielen Servern(TLTCPComponent) und Clients(TLTCPComponent), alle in einem eigenen Thread. Dabei gibt es jeweils ein "HauptServer" bzw "HauptClient" über den MetaDaten ausgetauscht werden... Bei der Verbindung eines HauptClients zum HauptServer werden alle Adressen der Anderen Servern zum HauptClient gesendet. Dieser kann daraufhin mehrere Ports öffnen. Soll jetzt ein String versendet werden. Wird dieser erst in viele kleine Teile aufgeteilt (es werden hash's berechnet, u.s.w). Über den HauptClient und HauptServer wird dann ausgemacht über welche normale Ports gesendet wird.
Am Ende wird das alles wieder zusammen gebaut.
Vorteil: Die Sendeleistung Skaliert nahzu Proportional mit den Anzahl der verwendeten Ports (60 MB/s waren ohne große Probleme möglich ( bei 127.0.0.1 ) ).

Problem:
Allerdings setzt der Verbindungsprozess vorraus, das Der Server seine IP und Port Adresse kennt und diese an den Client senden kann.
Wenn ich diese nun Nachfrage kommen komische Werte raus:
Das lässt sich mit einer Minimalen Konfiguration aus LNet nachvolziehen, eine version hab ich mal gezippt.
Bei steht in der "Debug-Memo", nachdem ich "Server" "Client" und "Ping Pong" gedrückt habe folgendes:

Code: Alles auswählen

Server: AcceptSocket: (Local:127.0.0.1:[color=#0080BF]55575[/color]) (Peer: 127.0.0.1:[color=#FF7700]0[/color])  TCP: (Port: [color=#FF7700]0[/color])
Client: ConnectSocket: (Local:127.0.0.1:[color=#00BF00]23456[/color]) (Peer: 127.0.0.1:[color=#FF0000]23456[/color])  TCP: (Port: [color=#FF0000]23456[/color])
Client: CanSendSocket: (Local:127.0.0.1:23456) (Peer: 127.0.0.1:23456)  TCP: (Port: 23456)
Server: CanSendSocket: (Local:127.0.0.1:55575) (Peer: 127.0.0.1:0)  TCP: (Port: 0)
Server: ReceiveSocket: (Local:127.0.0.1:55575) (Peer: 127.0.0.1:0)  TCP: (Port: 0)Ping
Client: ReceiveSocket: (Local:127.0.0.1:23456) (Peer: 127.0.0.1:23456)  TCP: (Port: 23456)Pong
Ich interpretiere die Ports einmal wie folgt:
Der Grüne: Das ist der Port des Servers.
Der Blaue: Das ist der Port des Clienten (Der Client bekommt wahrscheinlich irgendeinen Port "zufällig" zugeordnet, da nur angegeben wird zu welchen Server er Connecten soll.
Die Orangenen: Das müsste logischerweise der Port des Servers selbst sein ( Wenn der Blaue, der des Clienten ist ). Nur frag ich mich warum der Server seinen Eigenen Port nicht kennt. Das der Server seine eigene IP nicht kennt ist verständlich (weil man z.B. über das Netzwerk/ das Internet / Hamachi auf den gleichen PC mit 3 Verschienden IP Adressen zugreifen kann). Aber seinen eigenen Port müsste der Server doch kennen, oder ? )
Die Roten: Müssten den Port des Clienten selbst anzeigen. Wieso weis der Client allerdings nicht, das er (zumindest laut Server), auf 55575 läuft ? Das ist für mich zwar nicht notwendig (Da keiner zum Clienten connecten muss... ), aber das System dahinter zu verstehen würde mir nicht schaden...

Zum schluss noch ein Paar Auszüge aus dem Code(die .pas is 150 Zeilen groß, wobei darin 10 Proceduren mit nur 1 Zeile Code enthalten sind...

Code: Alles auswählen

function TForm1.INFO(aSocket: TLSocket; aTCP: TLTCPComponent): string;
begin
result := 'Socket: (Local:' + aSocket.LocalAddress + ':' + InttoStr(aSocket.LocalPort) + ') (Peer: ' + aSocket.PeerAddress + ':' + InttoStr(aSocket.PeerPort) + ')  TCP: (Port: ' + InttoStr(aTCP.Port) + ')';
end;   
 
procedure TForm1.fSOnAccept(aSocket: TLSocket);
begin
Memo1.Lines.Add('Server: Accept' + Info(aSocket,Server));
end;
Für jegliche Hinweise, was diese Ports, bzw IP Adressen welche dort ausgegeben sind wirklich bedeuten, oder wie ich noch am Client feststellen kann zu welcher Adresse ich Connecten muss ( bzw. der Server seine Eigene Adresse rausfindet) wär ich sehr Dankbar.
Dateianhänge
SimpleLNET.zip
Kompletter Code incl .exe (Für die die Lnet 0.65 nicht installieren wollen)
(1.01 MiB) 111-mal heruntergeladen

Code: Alles auswählen

Signatur := nil;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: LNet TLSocket indentifiziertbar durch ip + Port ?

Beitrag von mschnell »

Der lokale Server- (Listening) Port wird standardmäßig bei Eintreffen einer Verbindung geändert, damit der ursprüngliche Port für einen neuen Verbindungsversuch von außen wieder frei ist. Nach dem Öffnen findet die Datenkommunikation über den neuen Port statt.

-Michael

Antworten