Internetchat und Dateien-Übertragung mit lnet

Alle Fragen zur Netzwerkkommunikation
Antworten
Techno
Beiträge: 18
Registriert: Mo 14. Okt 2019, 10:24
OS, Lazarus, FPC: Windows 10 (L 2.0.10 FPC 3.2.0)
CPU-Target: 64Bit

Internetchat und Dateien-Übertragung mit lnet

Beitrag von Techno »

Guten Abend zusammen,

ich entwickle ein Chat-Programm in Lazarus und benutze dafür lnet. Die Übertragung von Texten von einem zum anderen PC (Server <-> Client) funktioniert reibungslos, jedoch nur, wenn sich beide Geräte im selben W-Lan-Netzwerk befinden. Schon die Verbindung zu dem anderen PC über die IP-Adresse und einen Port scheitert. Außerdem weiß ich nicht, wie Dateien, wie z. B. Bilder, per lnet übertragen werden können, falls dies überhaupt möglich ist.

Hier noch einmal meine konkreten Fragen:

(1) Wie kann ich die Datenübertragung von einem Gerät auf ein anderes mit lnet realisieren, wenn sich diese nicht im selben (W-)Lan-Netzwerk befinden?
(2) Ist es möglich, mit lnet Dateien wie Bilder / Audios etc. zu übertragen? Falls dies der Fall sein sollte, wie genau kann ich es machen?

Ich besitze bereits einige Erfahrung im Programmieren in Pascal / Delphi und mit Lazarus, doch wenn es um die oben genannten Aspekte geht, bin ich ein Anfänger.

Vielen Dank schon im Voraus! :D
Grüße,

Techno

Warf
Beiträge: 1907
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Internetchat und Dateien-Übertragung mit lnet

Beitrag von Warf »

Techno hat geschrieben:(1) Wie kann ich die Datenübertragung von einem Gerät auf ein anderes mit lnet realisieren, wenn sich diese nicht im selben (W-)Lan-Netzwerk befinden?
(2) Ist es möglich, mit lnet Dateien wie Bilder / Audios etc. zu übertragen? Falls dies der Fall sein sollte, wie genau kann ich es machen?


Zu (1): Ich denke mal du benutzt ein Peer basierten Chat,also jeder Nutzer spricht direkt mit dem Nutzer mit dem er sprechen möchte, dabei ist dann einer der Server und der andere der Client (Peer basiert, weil man praktisch unter "peers" also gleichberechtigten ist, jeder hat die selbe funktionalität). Da macht dir NAT aber einen gewaltigen Strich durch die Rechnung. Das Problem ist, die Netzwerke haben einen eigenen Adressraum, und sind an das Internet über eine einzige Adresse verbunden. Der Router Managed dabei dann welche Daten an welchen Nutzer gehen über Ports. Um also einen Server bereitzustellen muss ein Nutzer dem Router sagen was für einen Port er bereit stellen soll. Das bedeutet 1. Der nutzer muss zugriff auf den Router haben um im Webinterface Portforwarding einstellen zu können, 2. Zwei nutzer aus dem selben netzwerk können nicht den Selben Service über den gleichen Port bereitstellen (3. manche ISP's geben router aus die Port forwarding schlicht weg nicht erlauben).

Lösung: Das betrifft nur Server. Clienten können hinter beliebig vielen Nats stecken. Du musst also von einer Peer Architektur auf eine Hirachiche Server-Client Architektur wechseln. Da stellst du einen Server, bei dem sich die Clienten anmelden können, und für eine Nachricht sendest du diese an den Server, der sie dann an den Clienten weiter sendet. Also so, alice will mit bob reden, und Sven stellt den Server:
A->S: Connect(A) // Alice stellt eine verbindung mit Sven her und stellt sich als A vor
A->S: Msg(A, B, M) // Alice sendet an Sven eine nachricht bestehend aus ihrem eigenen namen (A), dem Empfänger (B) und der Nachricht an Bob (M)
A->S: Disconnect // Alice kann nun die verbindung trennen, da die nachricht jetzt bei Sven liegt
B->S: Connect(B) // Bob stellt verbindung zu Sven her
S->B: Msg(A, M) // Sven erkennt das er eine Nachricht von Alice für Bob hat, und sendet die zusammen mit dem absendernamen an Bob
B->S: ... // Jetzt kann bob eine nachricht senden, disconnecten, oder sonst was tun

Man kann das ganze auch Dezentral gestalten, sodass Alice und bob einen eigenen Server haben, dann Alice an ihren Server die Nachricht schickt, dieser dann Bobs server kontaktiert, welcher die nachricht dann an Bob weiter leitet wenn er online ist (so funktioniert z.B. Mail oder auch das Matrix Protokoll). Ist ne option wenn man kein fan von Zentralisierten Lösungen ist.

Das protokoll oben hat natürlich absolut keine sicherheiten drin, jeder kann sich als alice ausgeben und dann Infos an Bob schicken

Zu (2): Im grunde sind alle Nachrichten Bytes. Strings sind auch nur bytes, deren inhalt als Charaktere interpretiert wird. Technisch gibt es keinen Unterschied zwischen dem Senden von einem String und dem Senden von einem Byte Array. Ich kenn mich jetzt nicht sonderlich gut mit lnet aus (also gar nicht), aber im schlimmsten fall kannst du sowas machen:

Code: Alles auswählen

setLength(StringZumSenden, Length(DatenAlsBytes));
Move(StringZumSenden[1], DatanAlsBytes[0], Length(DatenAlsBytes));
SendString(StringZumSenden);

Gibt aber garantiert bessere optionen, denn garantiert ruft die methode zum senden von strings einfach eine Methode zum Senden von Bytes auf
Ansonsten, kannst du die Daten auch Base64 Encoden, erhöt die Nachrichtengröße aber um 37% im vergleich zu direkter Byte übertragung

Techno
Beiträge: 18
Registriert: Mo 14. Okt 2019, 10:24
OS, Lazarus, FPC: Windows 10 (L 2.0.10 FPC 3.2.0)
CPU-Target: 64Bit

Re: Internetchat und Dateien-Übertragung mit lnet

Beitrag von Techno »

@Warf Vielen Dank für deine ausführlichen Antworten und Erklärungen!
Ich werde es morgen ausprobieren.
Einen schönen Abend noch!
Grüße,

Techno

Antworten