PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RFC: Qt Socket Tutorial



anda_skoa
25-05-2003, 19:17
Hi,

da vermehrt QSocket Sachen gefragt werden, hab ich mir gedacht, ich mach ein kleines Beispiel zu Socket Programmierung mit Qt.

Ich hab das Beispiel angehängt, bräuchte nun aber Feedback, welche Sachen ich im begleitenden Text schreiben soll.

Also welche Codeteile vielleicht komplizierter sind, etc.

QTDIR und QMAKESPEC setzen, bevor man make aufruft.
Das Hauptmakefile generiert dann die anderen.

Dank im Vorraus für alle Antworten.

Ciao,
_

EDIT: Anhang gelöscht. Das Tutorial ist hier http://www.mrunix.de/forums/showthread.php?s=&threadid=32189

tuxipuxi
25-05-2003, 22:04
hi,

ich habe mir bis jetzt noch nicht die sourcen angeguckt, nur das programm, ich wuerde sagen ein wort reicht: super.

es waere toll wenn du zu dem programm, oder auch allgemein zu dem konzept ein paar worte schreiben koenntest.

auf jeden fall daumen hoch!

gruss,

tuxipuxi.

anda_skoa
25-05-2003, 22:34
Hier das ganze mit KDevelop Projekt Datei.

Es wird weiterhin nur qmake und dessen Einstellungen gebraucht!
Das KDevelopprojekt ist als Zusatzfeature für die KDevelopbenutzer gedacht.

Ciao,
_

EDIT: Anhang gelöscht. Das Tutorial ist hier http://www.mrunix.de/forums/showthread.php?s=&threadid=32189

wodda
29-05-2003, 00:26
hi!

dank deinem bsp, klappt jetzt alles :-)
ich finde es super selbsterklärend

großes Danke nochmal

mfg wodda

wodda
29-05-2003, 02:22
hi alles leider doch nicht.
folgendes Problem:

slotClientDisconnected() wird nicht aufgerufen.
dh. zb:
ich erstelle einen server, lasse einen client connecten, trenne nun den server. Der Client merkt nix davon, und der Socket bleibt offen.
er geht jedoch wie erwartet für jeden client in diese schleife:



for (; iter.current() != 0; ++iter)
{
iter.current()->socket()->disconnect();
}


obwohl in der slotNewClient(QSocket* socket)



QObject::connect(socket, SIGNAL(connectionClosed()), this, SLOT(slotClientDisconnected()));

das signal zugewiesen wird.

m_server wird auch nirgends beim demo wieder auf "0" gesetzt? (add: setzte ihn beim Trennen auf 0)
was könnte ich übersehen haben?

thx wodda

anda_skoa
29-05-2003, 13:10
Original geschrieben von wodda
slotClientDisconnected() wird nicht aufgerufen.


slotClientDisconnect wrd aufgerufen, wenn ein Client disconnected.



dh. zb:
ich erstelle einen server, lasse einen client connecten, trenne nun den server. Der Client merkt nix davon, und der Socket bleibt offen.


hmm, komisch.
Beim m_clients.clear() sollte er ansich alle Clients löschen, die dann ihre Sockets löschen, was laut Qt Doku ein close() beinhaltet.



er geht jedoch wie erwartet für jeden client in diese schleife:



for (; iter.current() != 0; ++iter)
{
iter.current()->socket()->disconnect();
}



dieses disconnectt hat nichts mit dem Socket zu tun, das ist das QObject::disconnect, mit dem die Signals des Sockets von den Slots des Main Windows getrennt werden.



m_server wird auch nirgends beim demo wieder auf "0" gesetzt? (add: setzte ihn beim Trennen auf 0)


Danke, das war ein Fehler.
Ich hab eine korrigierte Version angehängt.

Ciao,
_

EDIT: Anhang gelöscht. Das Tutorials ist hier http://www.mrunix.de/forums/showthread.php?s=&threadid=32189

wodda
29-05-2003, 19:22
hi!

du hast "delete m_server;" jetzt 2x drin ;-)

--> der server meldet sich erst richtig von den clients ab sobald man das serverprogram beendet?

edit: gelöst :-)
habe ein bisschen in der doku gestöbert und dabei bin ich auf die folgende funktion gestoßen:

m_clients.setAutoDelete( true );

danach klappts auch mit dem clear :-)

mfg wodda

anda_skoa
02-06-2003, 15:47
Original geschrieben von wodda

edit: gelöst :-)
habe ein bisschen in der doku gestöbert und dabei bin ich auf die folgende funktion gestoßen:

m_clients.setAutoDelete( true );

danach klappts auch mit dem clear :-)


Hmm, steht das nicht schon im Konstruktor?

Ciao,
_

wodda
03-06-2003, 16:33
stimmt...
nur da ich dein tut meinen bisheriegen angepasst habe, ist diese zeile wohl irgendwo verloren gegangen :-)

thx wodda

anda_skoa
06-06-2003, 00:02
Ich hab das Tutorial jetzt im Tutorial Forum eingetragen.

Wie immer sind Verbesserungvorschläge willkommen.

Ciao,
_

TheDodger
01-07-2003, 21:55
Urgs, ein Thema was mich schon seit langem beschäftig und ich übersehe das Tutorial ... :-(

Hmm, anda_skoa, wie schwer ist es, dein Beispiel so abzuändern, das man eine UI-lose Applikation darausmacht und auch binary-Daten übertragen kann? ;)

anda_skoa
02-07-2003, 10:29
Original geschrieben von TheDodger
Hmm, anda_skoa, wie schwer ist es, dein Beispiel so abzuändern, das man eine UI-lose Applikation darausmacht und auch binary-Daten übertragen kann? ;)

UI-los ist kein Problem.
Binary empfangen geht auch, senden ist ein bischen komplizierter, weil man nicht immer annehmen kann, das ein "Paket" auf einmal weggeht. Da muss man dann das entsprechende Signal als Feedback benutzen.

Ciao,
_

TheDodger
02-07-2003, 12:47
Original geschrieben von anda_skoa
UI-los ist kein Problem.
[b][quote]
das werd ich wohl die nächsten tage sehen mpssen, wie einfach das geht ...
[quote][b]
Binary empfangen geht auch, senden ist ein bischen komplizierter, weil man nicht immer annehmen kann, das ein "Paket" auf einmal weggeht. Da muss man dann das entsprechende Signal als Feedback benutzen.

Ich glaube ein GET Funktion würde vorerst reichen ...
Gibt es dabei irgendetwas zu beachten?

anda_skoa
02-07-2003, 18:45
Hmm, nur empfangen sollte nicht schwer sein.

Einfach auch readyRead connecten und dann mit readBlock alles lesen, was bytesAvailable sagt.

Man darf nur kein readyRead ignorieren, weil man erst bei den nächsten neuen Daten wieder eins bekommt, aber neue Daten vielleicht nicht angenommen werden, weil der Puffer voll ist.

Ciao,
_