Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT3, Signals and Slots



pucki
28-12-2005, 20:56
hi,

mit nachfolgender klasse habe ich ein kleines problem. der konstruktor wird aufgerufen, die Verbindung wird auch aufgebaut und dann nur noch fragezeichen ....

das projekt (linkpruefung):
für das ganze exisitiert eine kleine graphische oberfläche. der benutzer drückt nach diversen einstellungen eine button. der verknüpfte slot ruft eine globale methode auf, die dann die eigentliche arbeit übernimmt. die klasse HttpClient soll die kommunikation mit dem webserver übernehmen.
verbindung aufbauen und die Antwort als String zurückgeben.

zuerst habe ich das ganze ohne signals versucht, ging natürlich nicht, also signals connected und debug-ausgaben hinzugefügt (cout << ""). nun mußte sich feststellen, dass nur das erste signal gesendet wird (hostFound()). die restlichen nicht. die syntax müßte stimmen, da ich ja das erste signal entgegennehmen kann. fehlermeldungen kommen keine.


HttpClient::HttpClient(QObject &w){
_socket = new QSocket();
connect( _socket, SIGNAL(hostFound()),SLOT(send_Socket()));
connect( _socket, SIGNAL(connected()),SLOT(send_Socket()));
connect( _socket, SIGNAL(bytesWritten( int )),SLOT(write_Socket(int)));
connect( _socket, SIGNAL(delayedCloseFinished()),SLOT(send_Socket()) );
}
void HttpClient::conSocket(const QString &host, const QString & url , Q_UINT16 port ){
// String zuruecksetzen
_readSocket = "";
_url = url;
_host = host;
_status=FALSE;
_error = "x";
_send = "";

// Verbindung herstellen
_socket->connectToHost( host, port );
// url an Socket schicken
/*QTextStream _sendToSocket (_socket);

QTextOStream(&_send) << "GET " << _url << " HTTP/1.1\n"
<< "Host: " << _host << "\n"
<< "\n";
cout << _send;
_sendToSocket << _send;
*/
}


und die klasse dazu:


class HttpClient: public QObject {
Q_OBJECT
private:
QString _readSocket, _url, _host, _error, _send;
QSocket *_socket;
bool _status;

public:
HttpClient(QObject &w);
~HttpClient();

void conSocket(const QString &host, const QString & url = (QString) "/", Q_UINT16 port = 80);
QString getString();
QSocket* getSocket(){
return _socket;
}

public slots:
void send_Socket();
void read_Socket();
void error_Socket(int);
void write_Socket(int);
};


wenn ich noch etwas nachreichen kann, dann sagt einfach bescheid. es wäre schön, wenn jemand den fehler finden würde ;-)

gruesse reinhard

pucki
30-12-2005, 13:02
so,
zwischenzeitlich habe ich noch ein paar kleine problemchen behoben, die mir doch ganz ordentlichen kummer gebracht haben.

- der request an den server wurde überarbeitet: "\r\n"
- header um den bereich "Connection" ergänzt
- das ganze auch noch mal selbst geschrieben ....

was mich jedoch immer noch zur verzweiflung bringt, sind die signals die ich hier connected habe. dem sender und dem empfänger habe ich zwischenzeitlich noch namen zugewiesen, die auch schön angezeigt werden, wenn ich bewußt einen slot angebe, der nicht existiert. die signals werden korrekt verbunden (rückgabe des befehls ist 1) und auch wieder gelöscht. dann habe ich noch den traffic mitgeschnitten. die server antworten auf den request, nur die signals werden nicht ausgelöst.
weder connected, noch readyRead und schon gar nicht bytesWritten. nur das signal hostFound kommt an und kann verarbeitet werden. der trafficmitschnitt beweißt jedoch, dass die kommunikation läuft.

kann mir noch jemand einen tip geben, wo ich hier ansetzen kann?

gruesse
Reinhard

locus vivendi
30-12-2005, 15:13
Kannst du mehr Code posten? Dann könnte ich nochmal schauen.

pucki
30-12-2005, 19:16
ich habe mal die beiden files angehängt ....

ich habe allerdings noch ein wenig daran herumgespielt ...

wenn du noch etwas entdeckst, was so nicht in Ordnung ist, dann sprich mich ruhig darauf an ;-). ich habe erst mit qt angefangen und mit c++ bin ich auch noch nicht viel länger zu gange ;-)

gruesse

locus vivendi
30-12-2005, 21:01
Deine Probleme kann ich nicht nachvollziehen. Ich habe mit den beiden Dateien mal ein übersetzbares Programm gemacht, und aus deinen Dateien nur dieses "linkproj..." sonstwas-Include rausgenommen, sowie eine Ausgabe der gelesenen Daten eingebaut. Das funktioniert eigentlich. Ich habe meine Dateien mal angehängt.

Ausgabe bei mir:


11socket 0x80bdc90
send
read

read data = HTTP/1.1 302 Found
Location: http://www.google.de/index.html
Set-Cookie: PREF=ID=125f1fa5ae733752:TM=1135975912:LM=11359759 12:S=6KQqKwfE2016IexC; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html
Server: GWS/2.1
Content-Length: 231
Date: Fri, 30 Dec 2005 20:51:52 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=us-ascii">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.de/index.html">here</A>.
</BODY></HTML>


Du solltest übrigens keine Namen, die mit Unterstrich+Großbuchstaben beginnen, als Include-Guards verwenden. Das verbietet C++.

pucki
30-12-2005, 21:51
Deine Probleme kann ich nicht nachvollziehen. Ich habe mit den beiden Dateien mal ein übersetzbares Programm gemacht, und aus deinen Dateien nur dieses "linkproj..." sonstwas-Include rausgenommen, sowie eine Ausgabe der gelesenen Daten eingebaut. Das funktioniert eigentlich. Ich habe meine Dateien mal angehängt.

Du solltest übrigens keine Namen, die mit Unterstrich+Großbuchstaben beginnen, als Include-Guards verwenden. Das verbietet C++.

thanks, ich habe halt mal in die header-files reingeschaut und dann einfach genau so gemacht. aber ich werde das in zukunft berücksichtigen ;-).

dass bei mir die signals nicht kommen wird dann wohl an der implementierung des ganzen liegen.

ich erstelle eine gui mit dem designer, sowie die main, usw..
in der gui ist ein button mit dem ich über den zugehörenden slot eine methode aufrufe, die dann die verbindung startet. von dort aus übergebe ich eine pointer an die methode, die den dann an die klasse httpclient übergibt ...
etwas verworren, aber ich wußte nicht wie ich das sonst realisieren sollte ....
hast du icq? dann könnten wir mal quatschen, warum, usw ...

gruesse
reinhard

pucki
01-01-2006, 11:26
so,

dank vivendi ist das problem lokalisiert.

nicht die klasse selbst ist das problem, sondern die implementierung in das projekt.

das Objekt das ich erstelle wird einfach wieder gelöscht bevor die signals überhaupt abgesetzt werden können.

grüsse und allen ein Gutes Neues Jahr