Objekt einer Klasse in Klasse verwenden
-
Zeig doch auch Mal accept.
-
void Socket::accept(Socket listen_sock) { _sock = ::accept(listen_sock._sock, NULL, NULL); }Der Fehler tritt aber denke ich bei dem listen-Socket auf, accept() bekommt nämlich kein gültiges Socket mehr übergeben. Nur wieso das so ist und wie man das beheben kann, keine Ahnung.
-
Hier sieht man ganz gut, wieso man die Regel der großen drei einhalten sollte. Wenn der Destruktor implementiert wird, sollten auch operator= und copy-ctor überschrieben werden. Wieso? Weil sonst Kopien erstellt werden, die natürlich auch durch RRID wieder zerstört werden. Und dann wird closesocket aufgerufen und alle noch lebenden Kopien der Klasse werden ungültig. Ein Nebeneffekt, der eigentlich fast nie so gewollt ist.
Was hier passiert:
accept wird mit listen_sock aufgerufen. Da Du nicht über Referenz übergibst, sondern by value, wird listen_sock erstellt, indem eine Kopie vom übergebenen Socket erstellt wird (Kopie heißt hier einfach, dass alle Attribute kopiert werden).Wieso listen_sock jetzt nicht gültig ist, weiß ich aber nicht. Ein Socket definiert sich ja meist intern über eine Handle-ID. Klar ist, dass nach dem Funktionsaufruf der Destruktor aufgerufen wird, sodass das Socket danach zerstört wird. Wenn Du by reference übergibst, wird eben keine Kopie erstellt. Wie macht sich denn bemerkbar, dass das Socket ungültig ist? Du kannst gerne auch Mal listen und bind zeigen.
-
amolacar schrieb:
void Socket::accept(Socket listen_sock) { _sock = ::accept(listen_sock._sock, NULL, NULL); }du übergibst eine kopie deines objektes (_sock) und diese kopie wird am ende von der methode zerstört. ich vermute, du hast in deiner socket klasse keine eigenen kopierkonstruktor definiert und der generierte kopiert stupide alles hin und her und sobald hier deine methode verlassen wird, werden quasi beide sockets ungültig gemacht, d.h. der eine wird zerstört und zerstört damit die aufgebaute verbindung des anderen
für mehr als dieses vermutungen müsste man sich code angucken
(versuch einfach mal:
void Socket::accept(Socket & listen_sock) { _sock = ::accept(listen_sock._sock, NULL, NULL); }nur mal so, ob der fehler dann weg ist. weil dann wäre meine vermutung bestätigt. das design solltest du dann mal überdenken)
-
Ja jetzt klappt alles, danke!

Also Kopier-Konstruktor sowas?
Socket::Socket(const Socket &rhs) { _sock = rhs._sock; }
-
Wenn du den so bauen willst, hast Du das Problem noch nicht verstanden.
Du kannst copy-ctor und operator= "deaktivieren", wenn man keine Kopien erstellen sollte. Das ist wohl in Deinem Fall zu empfehlen.
Einfach in die Klasse schreiben:
private: Socket(const Socket&); Socket& operator=(const Socket&);ohne Implementierung. Jetzt gehen keine Kopien mehr.