QtNetwork mit LAN-Modul

Alles rund um die Programmierung mit Qt
Antworten
Jey
Beiträge: 4
Registriert: 5. Oktober 2010 14:38

QtNetwork mit LAN-Modul

Beitrag 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
Dateianhänge
client.zip
(2.45 KiB) 164-mal heruntergeladen
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 ;)
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: QtNetwork mit LAN-Modul

Beitrag von pfid »

Jey hat geschrieben:da ich erst seit rund einer Woche mit Qt programmiere und mich also noch nicht so auskenne.
Dann nimmer doch direkt mal folgendes in deine Bookmarks auf:

http://doc.trolltech.com/4.6/index.html

Davon willst du im Speziellen hauptsächlich:

http://doc.trolltech.com/4.6/classes.html
http://doc.trolltech.com/4.6/tutorials.html
http://doc.trolltech.com/4.6/examples.html

Und zu deiner Frage:

http://doc.trolltech.com/4.6/qtcpserver.html#details
http://doc.trolltech.com/4.6/qtcpsocket.html#details
Jey
Beiträge: 4
Registriert: 5. Oktober 2010 14:38

Beitrag 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?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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!
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Jey
Beiträge: 4
Registriert: 5. Oktober 2010 14:38

Beitrag 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

Code: Alles auswählen

tcpServer->nextPendingConnection();
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
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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

Code: Alles auswählen

tcpServer->nextPendingConnection();
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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag 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
Jey
Beiträge: 4
Registriert: 5. Oktober 2010 14:38

Beitrag 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.
Antworten