2 Stimmen

Schließen von 2 Steckdosen?

Ist es möglich, zwei Sockets zu verbinden?

Zum Beispiel, wenn ein Prozess als Router von Nachrichten zwischen 2 anderen Prozessen wirkt, wäre es in einigen Fällen möglich, zur Seite zu treten und eine Menge von Socket-IO zu sparen. Das scheint möglich zu sein, aber ich habe noch nie davon gehört, dass es gemacht wurde!

Wenn es möglich ist, ist es dann möglich sowohl auf Linux als auch auf Windows? Wenn ja, werden unterschiedliche Mechanismen verwendet, um dies einzurichten?

Übrigens, ich habe gerade das gefunden:

Linux splice() Systemaufruf.

Dies scheint dem nahe zu kommen, was ich suche (vorausgesetzt natürlich, dass dies auch mit Socket-FDs funktioniert), aber gibt es eine Windows-Äquivalente?

2voto

andcoz Punkte 2192

Soweit ich weiß, ist das nicht möglich.

Ein einfaches Beispiel: Wenn Ihre Prozesse auf drei verschiedenen Maschinen laufen, wie könnte die Proxy-Maschine beiseite treten, ohne den Datenverkehr auf TCP/UDP/whatever-Ebene umzuleiten?

Splice ist keine Lösung, es optimiert einfach den I/O-Transfer und vermeidet unnötige Speicherkopien, aber in jedem Fall benötigen Sie einen Prozess, der den Eingang überwacht und splice aufruft, um Daten an den Ausgang zu "übertragen" (und wenn die Sockets echte Netzwerksockets sind, müssen die Daten zweimal durch die Netzwerkkarte gelangen).

LLP, Andrea

1voto

james woodyatt Punkte 2154

Die kurze Antwort ist Nein.

Die etwas längere Antwort ist Nicht Generell. Der splice() Systemaufruf ist Linux-spezifisch und ist nicht für Sockets definiert. Wenn er für Sockets definiert wäre, dann wäre es eine Möglichkeit, eine im Speicher abgebildete Datei mit einem Stream-Socket zu verbinden. Es wäre nicht bidirektional. Was es in diesem Bereich auf Windows gibt, wissen nur die Götter.

Die äußerst geekske Antwort ist Nun, Sie könnten den Betriebssystem-Kernel erweitern, aber... das könnte nicht das sein, was Sie wollen. Wenn keiner der entfernten Adressen der beiden PF_INET oder PF_INET6 Sockets knoten-lokal ist, dann leitet der Router weiterhin Pakete zwischen den beiden entfernten Hosts, von denen jeder einen Socket mit 5-Tupel hat, das auf Ihren Router-Host verweist. Und nein, ich werde die dunklen Künste des ARP/ND6-Spoofings nicht erklären, um dieses Problem zu umgehen.

1voto

user1781368 Punkte 31

Ich habe so etwas in der Vergangenheit programmiert. Vorausgesetzt, Sie sind der Programmierer für alle drei Prozesse, ist es möglich, aber knifflig. Wenn Sie eine Socket-Verbindung A und eine Socket-Verbindung B haben, nehmen Sie die Informationen von A, senden sie an B und lassen B eine Verbindungsanfrage an A senden. Dies erfordert etwas Codierung, aber es sollte funktionieren. Bei mir hat es funktioniert. Hoffe, das klappt! Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X