nntp client

Alles rund um die Programmierung mit Qt
Antworten
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

nntp client

Beitrag von AlymcGeel »

Hallo!

Als erstes möchte ich sagen, dass ich noch gar keine erfahrung habe mit qt. C++ allerdings ist kein problem.

Ich hatte bis vor kurzem ein Windows Mobile smartphone und hab dafür einen NNTP client mit dem .net compact geschrieben.
Da ich beruflich mit C# programmiere war das kein problem.

Jetzt bin ich allerdings auf ein nokia c7 umgestiegen und hab mir gedacht ich schau mir mal qt an und versuche den nntp client zu portieren.

Allerdings hab ich echt probleme, da was zustande zu bringen. Ich bin auf die Klasse QAbstractSocket gestoßen mit dem man das doch realisieren könnte oder?

Jetzt hab ich ein bisschen code, nur tut der so gar nicht das was er soll, nämlich nix....

Code: Alles auswählen

if(ui->btn_connect->text() == "Connect")
    {
        socket_->connectToHost("news.tugraz.at", 119);

        if (socket_->waitForConnected(1000))
        {
Jetzt scheint der codeteil zu funktioneren. Zumindest lande ich oft im inneren If.

Weiter gehts dann mit dem der ersten Query um mir die newsgroups zu holen:

Code: Alles auswählen

 socket_->write("LIST\r\n");

    QString response = "";
    while (!socket_->atEnd())
    {
        response += ConvertByteArrayToString(socket_->read(100));
    }
ConvertByteArrayToString hab ich selbst geschrieben und da kann man ja eh nix falsch machen denk ich.
Jedenfalls hab ich auch schon hineindebuggt und es schaut aus als wär diese while bedingung falsch. Also es scheint als häng ich in einer endlosschleife
fest.

Könnte mir einer ein paar tipps geben, wie ich da weiterkommen könnte und wo es evtl howtos dafür gibt.

danke im Voraus!

lg Aly
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: nntp client

Beitrag von Christian81 »

Ein Socket ist asnychron. Du musst schon auf das readyRead() Signal warten und dann die Daten auslesen -> Grundlagen Signals/Slots
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

mh...ok danke. das erklärt einiges.

dann werd ich mir mal anschaun wie ich dieses event abfange.

lg
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: nntp client

Beitrag von Christian81 »

Nicht Events - Signals !
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

ok. sry. danke nocheinmal für die antwort. ich werde es mir anschaun.

lg
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

hallo. bin jetzt länger nicht dazugekommen an dem projekt weiterzuarbeiten deshlab wärme ich es erst jetzt wieder auf.

ich steh vor dem problem, dass das readyRead() signal nie ausgelöst wird. ich bin verbunden zum server. und wenn ich dann einen command für
z.b. das lesen aller newsgroupnamen absende, warte ich vergeblich auf das ready read signal um die antwort des servers zu lesen.

schreiben tu ich jetzt so:
QString cmd = "LIST\r\n";
socket_->write(cmd.toAscii(), cmd.length());

in der "console" hab ich stehn: QNativeSocketEngine::hasPendingDatagrams() was called by a socket other than QAbstractSocket::UdpSocket

und zwar ca 1000 mal. aber sagentut mir diese meldung leider gar nix.

hat jemand ahnung was da schief läuft?

lg
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: nntp client

Beitrag von solarix »

AlymcGeel hat geschrieben: Ich bin auf die Klasse QAbstractSocket gestoßen mit dem man das doch realisieren könnte oder?
Eigentlich nicht... nntp ist TCP.. also brauchst du ein QTcpSocket.. war das oben ein Schreibfehler, oder wurstelst du da wirklich was mit einer eigenen Klasse..?
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

Hallo. Nein das war kein schreibfehler. Ich verwende QAbstractSocket. Ich dachte mir auch , dass es nicht gehen würde, aber ich kann ganz normal eine instanz davon erstellen und mit der arbeiten.
Ich hab da so ein code snippet gefunden wo das so gemacht wurde, also dachti ich mir, es wird schon passen.

Aber ich werde auf QTcpSocket umsteigen. wichtig ist halt, dass ich den Port angeben kann.
lg
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

Mit einem TcpSocket hats natürlich geklappt. danke!
jetzt steh ich vor dem nächsten problem, das mir nicht ganz einleuchtet.

beim nntp protokoll müssen die commands immer mit \r\n abgeschlossen sein, sonst erkennt sie der server nicht.

wenn ich jetzt eine anfrage: write("listgroup gruppenname\r\n"); funktionierst genau wie erwartet und ich bekomm die IDs der artikel zurück
wenn ich aber : Qstring = "listgroup " + param_mit_gruppenname + "\r\n" an den server schicke, erkennt der den befehl nicht.
der debugger hat mir dann gesagt, dass auf diese weise irgendwie das \r verschluckt wird. Jetzt ist die frage warum und wie schaff ich es
dass sicher ein \r\n am ende steht?


lg
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: nntp client

Beitrag von solarix »

Ein QString ist kein "Datencontainer", sondern eben ein "Text". Wie du selbst festgestellt hast, gehören dazu nicht alle ASCII-Character..

Für beliebige Daten (z.B. in Netzwerkprotokollen) ist daher "QByteArray" wesentlich besser geeignet.

hth..
AlymcGeel
Beiträge: 12
Registriert: 5. September 2011 13:59

Re: nntp client

Beitrag von AlymcGeel »

danke!, werds gleich probieren
Antworten