ubuntuusers.de

Socket-Programmierung in C/C++: Connection Refused

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

Isodrink

Anmeldungsdatum:
19. Juli 2007

Beiträge: Zähle...

Hallo,

ich habe ein Problem bei der Verbindung über Sockets zwischen zwei Linux Ubuntu-Rechnern. Ich habe einen Klienten geschrieben, der ein Bild von einer Kamera an einen Host-Rechner überträgt und der Hostrechner soll dieses Bild dann anzeigen/speichern. Der Klient ist in C mit C-Sockets implementiert, der Server ist in C++ mit wxWidgets programmiert und stellt so eine GUI zum anzeigen und empfangen der Bilder dar. Wenn ich nun Klient und Server auf ein und demselben Linux-Rechner über die IP 127.0.0.1 laufen lasse, funktioniert es einwandfrei. Lasse ich jedoch Klient und Server auf jeweils einem eigenen Rechner laufen, so kommt entweder die Fehlermeldung vom Klienten "Connection Refused" oder der Klient bleibt bei der Funktion "connect" stehen. Gibt es irgendeine Firewall, die die Verbindung zwischen Klient und Server verhindert? Was könnte das Problem noch hervorrufen? Leider kenne ich mich mit der Netzwerkkonfiguration von Linux nicht so gut aus.

hackepeter

Avatar von hackepeter

Anmeldungsdatum:
8. Januar 2006

Beiträge: 185

Wohnort: München

Hallo,

da musst du uns schon mehr verraten: wie sieht das Netzwerk aus (funktioniert es z.B. mit einem Ping?), welchen Port verwendest du usw. Falls nicht zu lange, wäre auch der Quelltext des socket-Aufbaus auf beiden Seiten interessant.

Gruß HP

Isodrink

(Themenstarter)

Anmeldungsdatum:
19. Juli 2007

Beiträge: 6

Hallo,

ich habe den code gerade nicht hier, den werde ich bei Bedarf später posten 😳

Der code des Klienten ist aber im Großen und Ganzen dem Beispiel auf dieser Seite http://www.pc-adviser.de/socket_programmierung.html entlehnt.

Also das Netzwerk ist denkbar einfach, zwei Lankabel und ein Switch bzw. ich habe es auch mit einem Crosskabel versucht. In jedem Fall hatte ich einen Ping, aber in Keinem Fall eine Verbindung über die Sockets. Ich habe auch die Beobachtung gemacht, dass, wenn man ein Patchkabel am Switch durch ein Crosskabel tauscht (neuere Switches, so wie meiner, sollten das ja abkönnen) die Fehlermeldung "Connection Refused" erscheint, während, wenn ich zwei Patchkabel verwende, die Funktion Connect() einfach das Programm des Klienten blockiert. Ich verwende den Port 10739, der sollte eigentlich nicht belegt sein. Beide Rechner besitzen eine feste IP. Ich kann gerne auch die Ausgabe von ifconfig posten, aber nicht mehr heute.

hackepeter

Avatar von hackepeter

Anmeldungsdatum:
8. Januar 2006

Beiträge: 185

Wohnort: München

Du kannst ja auch mal auf dem Empfangsrechner überprüfen was ankommt. In einem Terminal eingeben:

1
sudo tcpdump -i eth0

"eth0" gegebenenfalls durch den richtigen Namen ersetzen falls das bei dir anders heißt. Dann einfach mal deine Anwendung starten. Da der ping wie du sagst funktioniert, tippe ich aber eher auf einen Programmierfehler als auf ein Netzproblem.

Gruß HP

Isodrink

(Themenstarter)

Anmeldungsdatum:
19. Juli 2007

Beiträge: 6

Ah, danke für den Hinweis, das werde ich ausprobieren.

Müsste sich ein Programmierfehler nicht immer bemerkbar machen? Wenn ich Klient und Server am selben Rechner über die IP 127.0.0.1 laufen lasse funktioniert ja alles wie gewünscht. Das einzige, was ich am Programm geändert habe, um Client und Server auf verschiedenen Rechnern laufen zu lassen, ist, dass ich die IP von 127.0.0.1 auf die IP der Rechner geändert habe. Aber es kann auch sein das es wirklich ein Programmfehler ist. Ich habe immer an einem Rechner entwickelt, weil das einfacher war. So habe ich zwischendurch natürlich nicht ausprobiert, ob es auch auf verschiedenen Rechnern läuft.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Wenn ich Klient und Server am selben Rechner über die IP 127.0.0.1 laufen lasse funktioniert ja alles wie gewünscht. Das einzige, was ich am Programm geändert habe, um Client und Server auf verschiedenen Rechnern laufen zu lassen, ist, dass ich die IP von 127.0.0.1 auf die IP der Rechner geändert habe.

Ich weiß zwar nicht was für dich die "IP des Rechners" genau ist, und was du da eingestellt hast, aber auf welcher IP dein Server "horcht" ist entscheidend, da der Server dann nur Verbindung von diesem Interface mit dieser IP entgegen nimmt.

Du sagtest mit 127.0.0.1 auf dem Server und lokal funktionierte es. Das ist schonmal gut. Remote aber nicht. Wahrscheinlich liegt es dann daran das du auf dem Falschen Interface horchst, und wenn dein Client eine verbindung aufbaut dann bekommt es "Connection Refused" weil auf diesem interface dein Server gar nicht horcht.

In der Regel kannst du aber auch angeben das du auf alle Interfaces horchen möchtest. Entweder musst du dafür die IP Adresse "0.0.0.0" eintragen zum Horchen oder beim Horchen auf einer IP kannst du einen speziellen Parameter angeben um das zu erreichen. Wie das genau geht müsstest du wohl der Wx Dokumentation entnehmen.

Isodrink

(Themenstarter)

Anmeldungsdatum:
19. Juli 2007

Beiträge: 6

Hallo,

ich habe das ganze heute bei mir nochmal aufgebaut und es hat auf Anhieb funktioniert. Warum weiß ich allerdings nicht.

Zur IP:

Also, beim Server habe ich den Port 10937 angegeben und eingestellt, das sich jeder Rechner (beliebige IP) mit dem Server verbinden kann. Dieser Rechner, auf dem der Server läuft, hat von mir die IP 192.168.1.100 bekommen. (ifconfig hats bestätigt) Der Client läuft auf einem Rechner mit der festen IP 192.168.1.10. Dort habe ich dann den Port 10937 angegeben und angegeben, der Client soll versuchen sich auf dem Server mit der IP 192.168.1.100 anzumelden.

Ich denke, damit hat sich das Problem dann auch erledigt, es gibt eine Verbindung und ich bekomme ein Bild, es ist also alles in Ordnung ☺

Wenn ich noch einmal Zeit habe, werde ich das alte Setup nochmal aufbauen und testen ob es geht, ich habe ja jetzt einen Programmierfehler ausgeschlossen.

Vielen Dank für eure Antworten und Hinweise ☺

Antworten |