Aufgabe 9


irgendwie raff ich das grade mit dem testen nicht, es heisst ja

wir hams gestartet mit

./port-forward 4445 -- /(..)/timed/ 4445

und dann inner zweiten Konsole
nc localhost 4445

dann kommt als ausgabe

./port-forward listening on port 4445
terminate me by hitting CTRL+C
Peer localhost.localdomain connected

und nach kurzer zeit

Error( gethostbyname() ): Connection timed out
-1074974837     

???


Gebt ihr da als zweiten Parameter 'nen Pfad an?! Das klappt natürlich nicht. Außerdem können timed und port_forward ja nicht auf dem selben Port horchen. Also timed irgendwo starten, dann den Hostname von der Kiste angeben, nicht den Pfad.
Bsp:

/bla/blubb/timed 1337
/bla/bla/port_forward 4711 – localhost 1337 (in 'ner zweiten shell)
nc localhost 4711 (in 'ner dritten shell)


hey danke für die schnelle antwort =) genau daran lags, opti!

[gelöst]
Hm.
Ich mache zum Test in meiner thread-Funktion erst mal ein write(arg->fd2, “Hallo\n”, …);
Komischerweise kommt das Hallo zweimal auf der gleichen Seite raus.
Die Threadfunktion habe ich aber garantiert mit umgekehrten Deskriptoren aufgerufen. Weiß jemand, woran das liegen kann?

Nachtrag:
Mann bin ich blöde! Ich habe natürlich nur eine Struktur verwendet. Durch den Tausch, habe ich somit natürlich auch die Werte im ersten Thread noch geändertn …


Aber nun was anderes :slight_smile:

Ich starte
./port-forward 1111 – localhost 22
auf der faui05

nun mach ich von zu Hause ne Verbindung auf.
Auf der faui05 sind nun zwei “Prozesse” mit port-forward zu sehen.
Wenn ich den Hauptprozess abschieße, läuft die Verbindung normal weiter.

Ist das richtig so?
Ich hätte im Moment gar keine Ahnung, wie man das Verhindern soll.

Muss ich in port-forward.c oder forward.c sonst noch irgendwelche Signalbehandlungen machen? (Außer SIGPIPE ignorieren)
Jetzt ist es ja so, dass das Hauptprogramm keine Meldung ausgibt, wenn ich ein Verbindungsthread zum Beispiel mit kill abschieße.
new_client kehrt dann ja nicht zurueck.


seh ich das richtig so, dass wir die a) gar nicht machen muessen, sondern diese vollkommen optional ist. und falls wir sie nicht machen, dass wir einfach die connbroker.o verwenden, anstelle das selber anzupassen???


  1. Ja, es ist normal dass der Kindprozess nach dem Ende des Vaterprozesses noch normal weiterläuft.
  2. Da andere Signale nicht erwartet werden und damit ein abnormales Programmende darstellen, ist auch dieses Verhalten in Ordnung.

Ja, so steht es ja auch in der Aufgabenstellung…


Folgendes Problem: Wenn ich mein Programm mit timed teste und dann beende closed zwar timed aber nicht meine port-forward. Da meine port-forward.c mit der forward.o perfekt funktioniert liegt der Fehler in der forward.c . Da erstell ich zwei threads mit der aufgabe task auf die gewartet wird bis sie beendet sind. Nur irgendwie haut meine task nicht hin deshalb hier mal mein code:

“Sicherheitshalber wieder entfernt.”

PS: Hat sich erledigt.


bau dir noch ne schleife um das write, dass die erfolgreiche anzahl von geschriebenen bytes von denen des reads jeweils abzieht. ausserdem fehlt noch fehlerabfrage bei write und ueberpruefen von errno == EPIPE


Hi,

Ich bekomme beim Testen folgende Fehlermeldung:
connect: Invalid Argument

Aufgerufen habe ich connect wie folgt:

connect(soc, (struct sockaddr *)&serv_addr, sizeof(serv_addr);

wobei vorher die Sachen wie folge gebaut wurden:

soc = socket(PF_INET6, SOCK_STREAM, 0);

und

struct hostent *host_name;
struct sockaddr_in serv_addr;
host_name = gethostbyname(argv[0]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = atoi(argv[1]);
memcpy((char *) &serv_addr.sin_addr, (char *) host_name->h_addr, host_name->h_length);

Kann mir jemand sagen was da falsch is?


Du verwendest einen IPv6 Socket mit IPv4 Datenstrukturen. Für die Aufgabe sollte IPv4 verwendet werden (PF_INET, nicht PF_INET6)


Danke, ich hab das nun geändert. Hilft aber leider trotzdem nicht. Es heisst immer noch:
“connect: Invalid Argument”

Nun hab ich vor das memcpy ein
memset((char *) &serv_addr.sin_addr , 0, host_name->h_length + 1);
gesetzt, im naiven glauben es kann ja sein dass serv_addr.sin_addr nicht nullterminiert ist…
dann bekommt man:
“connect: Connection refused”

dunno…


wie rufst du portforward auf?


Mit

./port_forward 1234 -- wwwproxy.informatik.uni-erlangen.de 8080
Dann habe ich localhost:1234 im Browser als Proxy eingestellt und versucht im Browser “test.de” aufzurufen - der Port-Forwarder beendet die Verbindung mit der genannten Fehlermeldung.


ok… es liegt daran dass ich htons vergessen hab beim Port! Jetzt is zumindest das Problem behoben. Danke!


müsste das nicht heißen:

serv_addr.sin_port = htons((unsigned short) atoi(argv[1]));

EDIT: hab nicht auf seite 3 geschaut -.-


mmh soweit so gut, funzt glaub ich so wies soll, mein problem is jetzt nur noch dass ich irgendwie ne art lag drin hab, er gibt jetzt nur noch jede 2. sekunde aus (mit timed und nc localhost) is das egal?!
ich hab die vermutung es liegt irgendwie an der puffergröße,hab die willkürlich mal auf 50 gesetzt aber ka … oder muss ich den puffer evtl mitnem mutex umklammern?!