2012-10-22 10 views
5

Ich habe ein System, wo ich auf einen Socket hören und auf Client-Verbindung warten und dann die Verbindung zu einer anderen Anwendung übergeben, die ich starten werde, sobald die Verbindung hergestellt ist.Routing-Sockets zu einem anderen Port

Ich habe keine Kontrolle über diese andere Anwendung und kann nur den Port festlegen, wo es zuhören wird, aber ich möchte einen Prozess für jeden neuen Client haben.

Das ist, was ich versuche zu tun: die richtige Terminologie

routing

Ich habe nach einer Lösung gesucht, aber ich, was ich nicht haben, aber ich schaffte es auf finden Richard Stevens "Unix Network Programming" etwas über die AF_ROUTE Familie von Sockets, die mit einem SOCK_RAW kombiniert werden können, um eine Verbindung zu einem anderen IP und Port zu leiten. Aber es gibt zu wenig Dokumentation über how to use this flag und scheint Superuser-Privilegien zu benötigen (die ich vermeiden möchte).

Vielleicht gibt es eine einfachere Lösung, aber ich verwende wahrscheinlich die falschen Begriffe. Ist klar, was ich machen möchte?

+0

sind Apps und Ports 1: 1 Mapping? Wenn ja, warum können sie nicht selbst zuhören? – SparKot

+0

@SparKot Nicht genau. Für jeden neuen Client muss eine neue "APP" geöffnet werden. – JBernardo

+0

Können Sie die andere Anwendung dazu verleiten, stattdessen von einem anderen Dateideskriptor (z. B. stdin) zu lesen? Wenn ja, dann könntest du einfach den Socket fd auf stdin und die andere Anwendung "dup2" machen. –

Antwort

0

Ich glaube nicht, dass Sie in der Lage sein werden, den Socket wie gewünscht zu "übergeben", besonders wenn Sie "APP" nicht ändern und neu kompilieren können. Sockets umfassen verschiedene Verwaltungsgemeinkosten (Ressourcenverwaltung usw.), die mit dem Prozess verknüpft sind, dem sie gehören. Wenn Sie APP nicht erneut kompilieren können, gibt es keine Möglichkeit, die Schritte zum Akzeptieren einer Verbindung zu umgehen und einfach eine bereits geöffnete Verbindung zu Ihrem Router zu haben.

Haben Sie jedoch in Erwägung gezogen, den Router einfach als Durchleitung zu verwenden? Im Grunde, haben Sie Ihren "Router" Prozess verbinden über Sockets zu jedem "APP" -Prozess, den er hervorbringt, und einfach Echo, was auch immer er von dem entsprechenden Client an die entsprechende APP erhält, und umgekehrt APP für Client?

Dies fügt Overhead hinzu, und Sie müssen ein kleines Mapping verwalten, um zu verfolgen, welche Clients zu welchen Apps gehen, aber es könnte funktionieren (vorausgesetzt, die APP oder der Client basieren nicht auf der IP-Adresse) sie sind verbunden mit, etc). Vorausgesetzt, Sie können APP nicht neu kompilieren, gibt es möglicherweise nicht zu viele andere Optionen.

Der Code dafür ist relativ einfach. Ihr Handler für Daten, die von APP empfangen wurden, sucht nur nach dem Socket für die entsprechende App aus Ihrem Mapping und führt dann einen nicht blockierenden Versand dieser Daten durch. Ebenso der Handler für Daten, die vom Client empfangen wurden. Abhängig davon, wie genau sich die Clients und die App verhalten, müssen Sie möglicherweise ein wenig Synchronisierung durchführen (wenn Sie beides gleichzeitig erhalten).

+0

Ich wollte nicht wirklich auf dem Sockel lesen und schreiben, um beide Enden zu kommunizieren. Was wahrscheinlich getan werden könnte, ist die "APP", die von diesem Dateideskriptor gelesen wird. – JBernardo

+0

hrm, vielleicht sollten Sie die Frage bearbeiten, um zu klären, was die APP kann und was nicht? Die Art und Weise, wie ich lese "Ich habe keine Kontrolle über diese andere Anwendung und kann nur den Port einstellen, wo es zuhören wird" ließ mich interpretieren, dass es einen Sockel ablesen musste und es keine anderen Optionen gab.Wenn APP andere E/A-Optionen wie stdin/out hat oder vielleicht andere Kommandozeilenparameter, mit denen man spielen kann, könnten die Antworten den Leuten helfen :) – davec

+0

Ich hätte nicht gedacht, dass ich das könnte, aber Adam Rosenfields Kommentar oben kann eine Option sein. Ich versuche das jetzt, aber ich weiß nicht, ob es auch funktionieren wird – JBernardo

Verwandte Themen