Frage von thiesyy, 37

Port weiterleiten von Pc zu anderen?

Hallo ich habe Eine Portfreigabe gemacht mit Exposed host an meinen Einen computer, Ich suche ein Programm oder ähnliches Mitdem ich die Ports weiterleiten könnte übers Lokale Netzwerk. Falls Es ein Programm gibt sollte es am besten Für Linux sein. Ich kann auch Java/C++ Programmieren aber ich habe keine schnittstelle usw Gefunden! Würde mich über eine Antwort freuen!

MFG Thiesyy.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von martin7812, Community-Experte für programmieren, 14

Ich selbst würde ein kleines Programm schreiben, das das macht.

Du verwendest die Befehle:

int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(s, &adresse, sizeof(adresse));
listen(s, 5);

... um das Warten auf eingehende Verbindungen zu starten.

Danach verwendest du den Befehl:

int as = accept(s, NULL, NULL);

Um jeweils auf eine eingehende Verbindung zu warten. Du startest einen Thread für jede eingehende Verbindung.

In dem Thread stellst du dann eine ausgehende Verbindung zum zweiten Rechner her:

int s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s2, &adresse, sizeof(adresse));


Nun must du in dem Thread noch die Daten zwischen beiden Verbindungen hin- und herschaufeln. Das Ganze machst du ungefähr so:

while(1)
{
char buffer[GrosseZahl];
...
select(...);
if(FD_ISSET(as))
{
int l = recv(as, buffer, sizeof(buffer), 0);
if(l < 1) break;
send(s2, buffer, l, 0);
}
if(FD_ISSET(s2))
{
int l = recv(s2, buffer, sizeof(buffer), 0);
if(l < 1) break;
send(as, buffer, l, 0);
}
}
close(as);
close(s2);

Nach den zwei "close()"-Zeilen beendest du den Thread.

Leider ist die Verwendung von "bind()", "connect()" und "select()" nicht ganz so trivial, wie ich es hier dargestellt habe.

Da wirst du dich noch etwas einlesen müssen!


Kommentar von thiesyy ,

Danke, Ich werde es gleich mal versuchen

Kommentar von thiesyy ,

Was wurde mit &adresse gemeint?

Die Lokale ip Des servers #1?
Die Lokale ip Des Servers #2 (Zu dem die weiterleitung soll)?
Oder Die IP von meinem Provider?

Oder soll ich es so lassen?

Kommentar von martin7812 ,

Zunächst einmal Entschuldigung für die späte Antwort.

Bei "bind" und "connect" ist "addresse" ein Zeiger auf eine bestimmte Datenstruktur, die hauptsächlich eine IP-Adresse (im Beispiel eine IPv4-Adresse) und eine Portnummer enthält.

Wie gesagt: An dieser Stelle wirst du dich etwas einlesen müssen...

Im Fall von "bind" gibt die Struktur den Port an, der Verbindungen "annimmt". Das wäre also die IP-Adresse des ersten PCs und die Portnummer, die du weiterleiten willst. Eine IP-Adresse von "0.0.0.0" bedeutet: Verbindungen zu jeder IP-Adresse des ersten PCs weiterleiten

Im Fall von "connect" gibt die Struktur die IP-Adresse und den Port an, wohin du deine Verbindung weiterleiten willst.

Wenn du beispielsweise Verbindungen, die an Port Nummer 1234 ankommen, an den PC 192.0.2.2, Port 5678 weiterleiten willst:


struct sockaddr_in adresse;

adresse.sin_family=AF_INET;
adresse.sin_port=htons(1234);
adresse.sin_addr.s_addr=0; // 0.0.0.0
accept(...);

adresse.sin_family=AF_INET;
adresse.sin_port=htons(5678);

adresse.sin_addr=inet_addr("192.0.2.2");
connect(...);


Keine passende Antwort gefunden?

Fragen Sie die Community