Seite 1 von 1

nntp client

Verfasst: 5. September 2011 22:40
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

Re: nntp client

Verfasst: 6. September 2011 06:32
von Christian81
Ein Socket ist asnychron. Du musst schon auf das readyRead() Signal warten und dann die Daten auslesen -> Grundlagen Signals/Slots

Re: nntp client

Verfasst: 6. September 2011 08:57
von AlymcGeel
mh...ok danke. das erklärt einiges.

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

lg

Re: nntp client

Verfasst: 6. September 2011 10:02
von Christian81
Nicht Events - Signals !

Re: nntp client

Verfasst: 6. September 2011 12:06
von AlymcGeel
ok. sry. danke nocheinmal für die antwort. ich werde es mir anschaun.

lg

Re: nntp client

Verfasst: 4. Oktober 2011 20:06
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

Re: nntp client

Verfasst: 5. Oktober 2011 21:28
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..?

Re: nntp client

Verfasst: 6. Oktober 2011 07:54
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

Re: nntp client

Verfasst: 6. Oktober 2011 13:38
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

Re: nntp client

Verfasst: 6. Oktober 2011 22:25
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..

Re: nntp client

Verfasst: 7. Oktober 2011 11:16
von AlymcGeel
danke!, werds gleich probieren