Standard C Socket funktion close killt QT3
-
Hi,
Musst Du nicht closesocket anstelle von close verwenden?Was für ein OS, Complier, Library etc. verwendest Du?
Simon
-
Ich finde beim besten Willen in der sys/socket.h keine Funktion zum Schließen von Socktes.... komisch.
-
@Fellhuhn
Ich verstehe erlich gesagt nicht ganz wie du das meinst.Also auf Server seite gibt es einen socket für Requests, der mit accept auf Nachrichten wartet.
Hingegen sollte der Client (meiner Meinung nach) nicht andauernd in Verbindung zum Server stehen. Keine Ahnung habs so gelernt und es erscheint mir Ok zu sein einen socket nur dann zu verwenden wen ich ihn wirklich brauche..Also closesocket kenne ich gar nicht und finde auch keine Man-pages darüber.
Das close das ich verwende befindet sich in der LIb <unistd.h> und dient dazu einen Filedescriptor zu schließen, der ja bei Sockets erstellt wird.Also ich verwende Linux, und kompliere hier mit g++ (mir gcc funktioniert alles komischerweise)
Verwende folgende Libs
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <pthread.h> #include <arpa/inet.h> #include <string.h> #include <signal.h>
-
Folgendes wäre schon einmal besser:
#include <cstdio> #include <cstdlib> #include <stdbool.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <pthread.h> #include <arpa/inet.h> #include <cstring> #include <csignal>Nun, C++ ist kein C, daher kann es da zu Problemen kommen. Und wieso funktionieren QSockets nicht? Es kommt doch das gleiche beim Server an, nur die Aufrufe sind anders (und komfortabler wie ich finde).
-
Also wie gesagt bin C++ neuling und mit C gut vertraut. Wollte einen einfachen C server der mit einem C++ client interagiert.
Habe mich mit QSockets kurz befasst, konnte dem Server etwas via TCP schicken, konnte allerdings die Rückantwort nicht empfangen.
Ich weiß meine Fragen sind nicht die schlausten aber ich weiß noch nicht sehr viel über C++.
Habe bisher eine Makefile mit qmake erstellt. Habe jetzt die Libs wie beshrieben geändert, kann aber nicht mehr kompliieren.
gcc -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o networking.o networking.c
networking.c:15:18: Fehler: cstdio: No such file or directory
networking.c:16:19: Fehler: cstdlib: No such file or directory
networking.c:26:19: Fehler: cstring: No such file or directory
networking.c: In Funktion »isValidIP«:
networking.c:104: Warnung: Implizite Deklaration der Funktion »sscanf«
networking.c:104: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »sscanf«
make: *** [networking.o] Fehler 1
-
Zunächst mal zu deinem Problem:
Die Anwendung ist singlethreaded, also KANN es passieren, daß eine Oberfläche einen Timeout hat. Das passiert beispielsweise auch, wenn du in VStudio ein Oberflächenelement debuggst, und dieses für 60 Sekunden vom System nicht aktualisiert werden kann - die Oberfläche ist dann im Timeout und man muss das System neu starten.
Ist aber nur so ein Schuss ins Blaue.
Noch etwas: Die Anderen haben recht: TCP Verbindungen lässt man offen, bis eine Verbindung nicht mehr benötigt wird. TCP sendet nur Pakete, wenn Daten zu übertragen sind, oder um einen Timeout zu verhindern.
Im Übrigen lässt z.B. Windows XP zu jeder Zeit nur zwei TCP Verbindungen zwischen zwei Hosts zu. Evtl. ist die Verbindung noch nicht abgebaut, wenn du eine neue aufmachst, was beim dritten Aufruf zum Absturz führen könnte.
Cheers
Sid
-
rklapfer schrieb:
Also wie gesagt bin C++ neuling und mit C gut vertraut. Wollte einen einfachen C server der mit einem C++ client interagiert.
Habe mich mit QSockets kurz befasst, konnte dem Server etwas via TCP schicken, konnte allerdings die Rückantwort nicht empfangen.
Ich weiß meine Fragen sind nicht die schlausten aber ich weiß noch nicht sehr viel über C++.
Habe bisher eine Makefile mit qmake erstellt. Habe jetzt die Libs wie beshrieben geändert, kann aber nicht mehr kompliieren.
gcc -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o networking.o networking.c
networking.c:15:18: Fehler: cstdio: No such file or directory
networking.c:16:19: Fehler: cstdlib: No such file or directory
networking.c:26:19: Fehler: cstring: No such file or directory
networking.c: In Funktion »isValidIP«:
networking.c:104: Warnung: Implizite Deklaration der Funktion »sscanf«
networking.c:104: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »sscanf«
make: *** [networking.o] Fehler 1Wenn du C++ schreibst, muss die Quellcode-Datei auch .cpp heissen, oder du musst den Compiler anweisen, sie als CPP zu übersetzen.
(Er findet die includes/libs nicht, weil du als C und nicht als C++ Code kompilierst)
-
P.S.: DAS müsstest du aber wissen, wenn du "mit C gut vertraut" bist.
-
Ok, war echt blöde Frage.
Af jeden Fall herzlichen Dank, ich werde versuchen das Problem zu lösen bzw auf QSsockets umsteigen
-
Hallo
Deine Klasse ist von QWidget abgeleitet und ich kann mir vorstellen, dass QWidget eine Methode close besitzt. Kann es sein, dass Du diese aufrufst? Das würde auch erklären, warum dann Dein QT-Fenster verschwindet. Liegt die close Funktion für die Sockets wirklich im globalen Namensraum?. Dann musst Du es so
::close(...aufrufen.
DJohn
-
Ach gott, das wars!! So ein bescheuerter Fehler kann auch nur mir pasieren ...
Danke!!!