Mehrere TCP Server über mehrere Netzwerkkarten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
awus
User
Beiträge: 2
Registriert: Freitag 7. Januar 2022, 15:26

Hallo,
ich habe ein Problem wo ich gerade nicht weiterkomme.

Ich habe einen Etikettendrucker der über Ethernet an einen PC angeschlossen ist und möchte über einen weiteren Rechner den Drucker über TCP ansteuern. Leider ist der Drucker nicht dazu in der Lage vom mehreren Clients Daten zu drucken. Wenn ich also vom 2ten Rechner was Sende, werden die Daten erst gedruckt wenn der erste Rechner die TCP Verbindung unterbrochen hat. Es ist nicht möglich am ersten PC oder am Drucker irgendwelche Einstellungen zu ändern. Sowohl der 1te PC als auch der Drucken müssen so bleiben wie sie sind.

Meine erste Idee war es die TCP Signale mit dem 2ten Rechner abzufangen, die Seqenz und ACK nummer zu übernehmen und eine RAW Nachricht mit meinen Daten zu senden. Ich bin mir aber nicht sicher wie sich dann der 1te PC verhalten wird wenn der dann versucht Nachrichten zu senden. Die Kommunikation vom 1ten PC und dem Drucker sollte nicht gestört werden.

Meine 2te Idee ist das aktuelle Problem. Ich würde vor dem Drucker einen Raspberry PI anschießen und den als "Server Drucker" verwenden ohne dass im Netzwerk was geändert werden muss.
PC--->>Raspberry---->>>Drucker

Damit keine Einstellungen am 1ten PC geändert werden müssen, muss der Raspberry einen TCP Server mit der gleichen IP wie der Drucker haben und dann über eine weitere Netzwerkkarte als Client mit dem Drucker verbinden und die TCP Nachrichten dann 1:1 weiterleiten. Mit einer weiteren Netzwerkkarte kann ich dann mit beliebiger IP einen weiteren TCP Server erstellen und über den Client versenden. So hat der Drucker nur einen Client und ich kann mehrere PCs benutzen um Nachrichten an den Drucker zu senden.

Ich verwende einen Linux Rechner zum programmieren. Ich kann einen Server erstellen und einen Client aber wenn ich zuerst den Server mit IP 1 erstelle und dann versuche mit dem Client 1 zu verbinden, verbindet er sich mit sich selbst, und wenn ich erst den Client verbinde und dann den Server, erstellt er mir keinen Server. Es kommt auch ab und zu vor, dass ich keine Verbindung als Client aufbauen kann weil das Socket auf einer anderen Netzwerkkarte erstellt wird, wenn ich dann die "Server Netzwerkkarte" deaktiviere, dann funktioniert es wieder.

Kann ich in Python definieren, auf welches Interface ich ein Socket erstelle? Bis jetzt habe ich nur zeug zum Thema gefunden wo auf einen Server mehrere Clients verbinden aber ich brauche mehrere Server mit unterschiedlicher IP und ein Client.

Oder gibts eine elegantere Lösung für meine Situation?

Vielen Dank.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das Problem ist ja, dass du zweimal die gleiche IP geroutet haben willst. Einmal auf deine Ethernet-Schnittstelle, sagen wir mal ETH0, und dann aber *via* der zweiten ETH1 auf die eigentliche IP des Druckers. Wenn jetzt ein Paket fuer die IP reinkommt, was soll der PI dann machen? Soll der das lokal zustellen, oder via ETH1 weiterleiten? Und nach welchem Kriterium?

Ich sehe erstmal nicht, wie das mit deinem Setup gehen kann. Es mag irgendwelche Tricks geben wie Tags, die man an Pakete heften kann, und basierend darauf routing Regeln. Das habe ich mir aber nur gerade mal ueberlegt, und das ist alles eine Kernel/iptables Sache. Mit Python und den normalen socket-Schnittstellen kann man da mE nix ausrichten.

Der "einfache" Weg waeren zwei Pis, der eine ist im Subnetz A (in dem sowohl PC als auch Drucker sind), und mit der zweiten Karte in Subnetz B. Und der Zweite Pi genau "spiegelverkehrt", und an dem haengt der Drucker. Damit koennen auf dem ersten Pi der bestehende Rechner auf die IP zugreifen, und der Pi leitet das einfach durch via der zweiten Schnittstelle zum zweiten Pi, der dann den Drucker kontaktiert.
awus
User
Beiträge: 2
Registriert: Freitag 7. Januar 2022, 15:26

ok danke für die Antwort.
Die Pakete die versendet werden sind recht einfach und wirklich lang, deswegen wollte ich die Pakete über die Python Software von ETH0 empfangen und dann über ETH1(an Drucker) senden und wenn ich dann weitere PCs anschließe werden dann die Pakete von z.B. ETH2 empfangen und wieder über ETH1(Drucker) gesendet.

Die alternative wäre auch eine Option. Ist es möglich in Python gleichviel TCP Server Sockets (verschiedene IPs) zu erstellen wie Netzwerkkarten?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe schon verstanden, was du tun willst. Das Problem sind die Routen. Dein PI muss irgendwo die original IP *haben*, *und* an die original IP verschicken. Das geht eben nicht, jedenfalls nicht zu meiner Kenntnis.

Und du kannst pro IP 65535 Sockets aufmachen. Was das hilft ist mir aber unklar, wenn du feste IP/Ports brauchst.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um das nochmal klar zu machen: wenn du am Drucker die IP aenderen koenntest, waere das Problem trivial. Aber du hast gesagt, das geht nicht. Was auch nicht geht: alles bleibt im selben Netzwerk, der Drucker muss da raus. Sonst wird der Verkehr nicht ueber den Pi geroutet, und du hast zweimal die gleiche IP im selben Segment - das geht nicht.
Antworten