Seite 1 von 1
QtNetwork mit LAN-Modul
Verfasst: 6. Oktober 2010 09:35
von Jey
Moin Moin,
Ich muss schon sagen, dass ich recht froh war, als ich dieses Forum über Google gefunden habe.
Zu meinem Problem: Ich möchte gerne ein Programm schreiben, um ein LAN Modul anzusprechen. Das LAN-Modul besitzt einen Microcontroller, der Zeichen, die über das TCP/IP gesendet werden, in das UART-Format (RS232) übersetzt.
Um dies zu bewerkstelligen, habe ich mithilfe meines Qt-Buches eine einfache Server- und Client Anwendung geschrieben, die über das TCP/IP Protokoll kommunizieren. Dies funktioniert auch hervorragend.
Das eigentliche Problem besteht nun darin, dass ich eine Mischung aus meiner Server- und Clientanwendung erstellen muss: Ich muss über connectToHost(); zum Modul kontakt aufnehmen und einzelne chars senden können. Mein Problem liegt darin, dass ich keine Verbindung zu dem LAN Modul aufbauen kann. Sobald ich auf den 'send' Button drücke, erscheinen in der Konsole folgende Fehlermeldungen:
Code: Alles auswählen
JeyBee-Mint client # ./client
Object::connect: No such slot Client::displayError(QAbstractSocket::SocketError)
QObject::connect: Cannot connect (null)::disconnected() to (null)::deleteLater()
Segmentation fault
Könnt ihr mir bitte sagen was ich falsch mache? Ich währe auch gerne für optimierungen des Programms offen, da ich erst seit rund einer Woche mit Qt programmiere und mich also noch nicht so auskenne.
Die Files sind im Anhang.
P.S. was ist der Unterschied von TcpServer und TcpSocket? Brauche ich beide?
Greez Jey
Verfasst: 6. Oktober 2010 10:56
von padreigh
Die fehlermeldung sagt es doch eigentlich:
Code: Alles auswählen
Object::connect: No such slot Client::displayError(QAbstractSocket::SocketError)
QObject::connect: Cannot connect (null)::disconnected() to (null)::deleteLater()
Du hast irgendwo ein
connect( ... , SIGNAL( ... ), Client::Instance, SLOT( displayError(QAbstractSocket::SocketError) ) aber vergessen den SLOT in der Klasse Client zu schreiben .. ausserdem ist irgendwo noch ein zweites connect das einen nullpointer versucht mit irgendwas zu verbinden ... check deine connects durch

Re: QtNetwork mit LAN-Modul
Verfasst: 6. Oktober 2010 11:48
von pfid
Verfasst: 6. Oktober 2010 15:11
von Jey
Okay, das hat mir schonmal sehr viel geholfen
Nun habe ich nur noch ein Problem: Zur Zeit ist es so, dass ich auf eine Clientverbindung warte:
Code: Alles auswählen
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
Wie kann ich nun selbst Verbindung zu einem Client aufnehmen?
Ich habe folgendes versucht, was sich jedoch nicht compilen lässe:
Code: Alles auswählen
QTcpSocket *clientConnection = ("172.17.0.211".toInt());
Ich bin echt ratlos, könnt ihr mir auf die Sprünge helfen?
Verfasst: 6. Oktober 2010 15:25
von padreigh
Jey hat geschrieben:Code: Alles auswählen
QTcpSocket *clientConnection = ("172.17.0.211".toInt());
Geh schlafen wenn du das nicht besser hinbekommst. Oder fang nochmal ganz vorne mit c++ an ..... alternativ Gehirn einschalten und SCHAUN was du da machst!
Verfasst: 6. Oktober 2010 15:56
von Jey
hallo padreight,
Bitte nicht gleich in diesem Ton, es sind nicht alle perfekt. Ich programmiere C++ erst seit einiger Zeit, und da Qt noch einiges neues mitzubringen hat, ist das schon leicht verwirrend.
So wie ich das sehe ist clientConnection ein pointer. Über die Funktion
wird nun die IP adresse der Variable clientConnection überwiesen.
Ich sehe noch nicht ganz, wie ich clientConnection eine IP so zuweisen kann, dass diese nicht von der obigen Funktion übergeben wird.
Ich kann schon verstehen, dass dies für dich eine einfache Sache ist, doch für mich nicht, und darum frage ich hier nach
Grüsse Jey
Verfasst: 6. Oktober 2010 16:11
von pfid
Jey hat geschrieben:hallo padreight,
Bitte nicht gleich in diesem Ton, es sind nicht alle perfekt. Ich programmiere C++ erst seit einiger Zeit, und da Qt noch einiges neues mitzubringen hat, ist das schon leicht verwirrend.
So wie ich das sehe ist clientConnection ein pointer. Über die Funktion
wird nun die IP adresse der Variable clientConnection überwiesen.
Ich sehe noch nicht ganz, wie ich clientConnection eine IP so zuweisen kann, dass diese nicht von der obigen Funktion übergeben wird.
Ich kann schon verstehen, dass dies für dich eine einfache Sache ist, doch für mich nicht, und darum frage ich hier nach
Grüsse Jey
Wie oben schonmal erwähnt:
http://doc.trolltech.com/4.6/examples-network.html
Such dir eins davon aus, und schau wies gemacht wird.
Verfasst: 6. Oktober 2010 16:13
von Christian81
Der Client connected an den Server - nicht andersrum!
Mit nextPendingConnection() gibt dir der Server eine gerade geöffnete Client-Verbindung zurück.
Ein simples Client/Server - Beispiel ist übrigens auch in der Doku... (Fortune Server / Fortune Client).
Verfasst: 6. Oktober 2010 16:39
von padreigh
Jey hat geschrieben:Code: Alles auswählen
QTcpSocket *clientConnection = ("172.17.0.211".toInt());
KLASSE * name = IrgendnConstCharDing.toInt();
Der Stern heisst das ist ein Pointer auf KLASSE mit Namen name ... wenn danach ein = kommt aber kein "new KLASSE(konstruktorspezifische Argumente)" dann kann das nicht kompilieren.
Du sagst da "QTcpSocket ist da drüben (zeig,zeig), heisst clientConnection und ist dasselbe wie eine konstante Zeichenkette die irgendwie toInt() gemacht wurde ... und wunderst dich das es nicht kompiliert?
Das ist in etwa analog dazu, sich auf die Motorhaube deines Autos zu setzen, den Schlüssel in den Mund zu stecken, brumm brumm zu murmeln und sich dann zu beschweren das das Auto nicht losfliegt ...
Davon abgesehen machst du dir nichtmal die Mühe nachzuschaun wies geht ... das "Betriebshandbuch" wurde dir schon mehrmals gereicht.
QTcpSocket() kennt keine IP ... der kennt fast nix ausser Methoden seiner Abstrakten Basisklasse ... die kennt dafür dann connectToHost() der wieder keine Stringliterale kennt (zumindest nicht für IP Adressen) ... glücklicherweise gibts aber noch ne überladene Variante von connectToHost() die dann QHostAdress brauch ... und das ist dann endlich überladen für QStrings .... das bekommt man raus wenn man sich hinsetzt, nachdenkt und die Api liest, auf Links klickt und weiter liest ... im Übrigen habe ich noch nie was mit QTcpIrgendwas gemacht ... und es trotzdem gefunden ...
Verfasst: 6. Oktober 2010 20:38
von androphinx
So leid es mir tut, aber ich bitte dich: BACK TO THE ROOTS! Beschäftige dich noch einmal mit den Grundlagen (bzw. überhaupt). Wer eine Client/Server-Anwendung schreiben will, sollte auch wissen, wie das Client/Server-Prinzip funktioniert. Selbes gilt auch für dein C++. Wir alle waren mal Anfänger, aber sowas. wie du hier geschrieben hast, findet man in keinem noch so schlechtem Tutorial oder Buch.
Deswegen nimm dich einfach noch einmal ein wenig zurück und programmiere einfache Anwendungen, anstatt gleich Riesengeschütze auf zu fahren.
Mfg androphinx
Verfasst: 6. Oktober 2010 21:12
von Jey
androphinx hat geschrieben:
Deswegen nimm dich einfach noch einmal ein wenig zurück und programmiere einfache Anwendungen, anstatt gleich Riesengeschütze auf zu fahren.
wird gemacht, versprochen.