dmx81 Temat założony przez niniejszego użytkownika |
[Qt] QDataStream w komunikatorze, po zczytaniu danych, zostaje zawsze cos w buforze » 2010-09-28 21:55:52 kolejny problem... przesylam dane od klienta do serwera za pomoca QDataStream. Wyslana wiadomosc pojawia sie w oknie serwera, operacje powtarzam, jednak dane juz sie nie wyswietlaja . pozniej odkrylem, ze bufor nie jest do konca oczyszczany, a konkretniej zawsze zostaje 12 bajtow. Dopiero drugie przeczytanie danych oczyszcza bufor i mozliwy jest odbior nastepnych wiadomosci.
out <<( quint16 ) rozmiar out << string1;
stream >> blok stream >> string stream >> string2
nawet jesli wysle pusty string, pozniej i tak zostaje 12 bajtow, a kiedy wyswietlam to, co zczytalem do stringa2, nic sie nie wyswietla, nie wiem skad to sie bierze ponizej kod wysylania: void MainWindow::send() { QByteArray data; QDataStream out( & data, QIODevice::WriteOnly ); out.setVersion( QDataStream::Qt_4_6 ); out <<( quint16 ) 0; out << ui->tx->text(); out.device()->seek( 0 ); out <<( quint16 )( data.size() - sizeof( quint16 ) ); ui->line_nick->setText( ui->line_nick->text().setNum( sizeof( data ) ) );; socket->write( data ); ui->tx->clear(); }
|
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-09-30 00:03:50 nikt nie ma pomyslu co to moze byc? bo napisalem wszytsko od nowa i dalej to samo, wysylam stringa przez QDataStream, odbieram go i odczytuje, a w buforze pozostaje dalej jakas ilosc bajtow do odczytania... i nastepne odczytanie wiadomosci nie jest mozliwe, poniewaz odczyt nastepuje, gdy pojawi sie sygnal socket.readyRead() - a pojawia sie tylko wtedy, jesli poprzedni bufor zostal oczyszczony i sa nowe dane do zczytania. zrobilem tymczasowe obejscie i zczytuje te dane co zostaly do innego stringa - ale wiadomo, nie mozna tego tak zostawic. oczywiscie ustawiam setversion() na takie same dla wysylania i odczytywania. |
|
DejaVu |
» 2010-09-30 00:14:37 Ja mogę tylko tyle powiedzieć: http://doc.trolltech.com/3.3/qdatastream.html. Dodam, że pojawił się u nas kurs Kurs WinSock, C++. Polecam go poczytać, bowiem uświadomi Ci jak złożone jest zagadnienie transmisji danych. Do tej pory nie spotkałem się z sensowną biblioteką, wspierającą komunikację sieciową. Jedyne co biblioteki oferują to wygodniejszy interfejs wywoływania funkcji i zdarza się, że dostarczą Ci coś do serializacji danych (choć to już nie jest pewne). Całą mechanikę związaną z komunikacją musisz napisać sam, a zatem wymagają one znajomości tworzenia aplikacji TCP/UDP. |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-09-30 00:37:39 no tak, dokumentacje qt przegladam caly czas juz troszke, wydaje mi sie, ze serializacji dokonuje prawidlowo,robilem wg przykladu z ich dokumentacji oraz wg tutoriala jaki znalazlem, sprobuje zapytac na ich forum tematycznym, bo widze, ze nie ja jeden mam z tym problem, wczoraj zaczalem czytac winsock'a, przyznam, ze troszke ciezko sie czyta, ze wzgledu na styl pisania, niby luzny i jakby to powiedziec, autor dowcipami typu "to juz ostatnia rzecz. Tak. Nie. haha oklamalem Cie..." probuje nawiazac kontakt z czytelnikiem i moze przez to bardziej zaciekawic, ale dla mnie jest to popropstu rozpraszajace i czasem meczace, bo trace watek - ale co zrobic :) bo np kurs allegro byl napisany konkretnie i szybko wszedl do glowy, ale odbiegam troche od tematu. w kazdym razie bede probowal znalezc rozwiazanie, jak znajde to napisze, byc moze ktos tez mial podobny problem i cos napisze, gdzie szukac... |
|
DejaVu |
» 2010-09-30 15:59:39 Allegro jest po prostu banalne w porównaniu do komunikacji sieciowej :) |
|
malan |
» 2010-09-30 16:41:01 Nie znam Qt, ale może wyzeruj tą zmienną: QByteArray data; . |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-09-30 23:02:11 znaaaalazlem :):):) przeanalizowalem kod od pierwszego # do ostatniego ; 2 dni mi zeszly:P bo szukalem nie tam gdzie trzeba, myslalem, ze cos robie blednie, ale wszytsko ok, a nawet az za ok:P tzn Qt ma mechanizm sygnalow i slotow - jakis sygnal powoduje wykonanie sie jakiejs instrukcji, a ja jeden sygnal podpialem dwukrotnie - a konkretnie akcje wcisniecia przycisku push_button_SEND - w kodzie klienta, np: void MainWindow::on_pb_send_clicked() { wyslij(); }
podobnie mialem wcisnicie pb_send, a oprocz tego tak jakbym dopisal gdzies jeszcze: connect( pb_send, SIGNAL( clicked() ), this, SLOT( wyslij ) );
bardzo sie ciesze, ze znalazlem swoj blad :) no i skoro mowicie, ze obsluga sieci to sprawa trudna, to tym bardziej bede sie cieszyl, jak ukoncze swoj pseudo-komunikator (pseudo, bo komunikatory pewnie lacza sie z serwerem o stalym ip, ktory zawsze jest wlaczany, no i teraz musze dorobic mozliwosc odpisywania:P bo dziala pisanie w jedna strone, ale teraz funckje odczytu-zapisu juz mam nadzieje opanowalem, wiec pojdzie szybko :) ) |
|
« 1 » |