Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Qt] QDataStream w komunikatorze, po zczytaniu danych, zostaje zawsze cos w buforze

Ostatnio zmodyfikowano 2010-09-30 23:02
Autor Wiadomość
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.
C/C++
//najpierw jest zapis:

out <<( quint16 ) rozmiar //16bitow rozmiar
out << string1;

//pozniej odczyt

stream >> blok // 16bitowa zmienna
stream >> string // tu po zczytaniu zostaje jeszcze 12 bajtow
stream >> string2 //dopiero tu sie zeruje
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:

C/C++
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();
}

P-22473
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.
P-22499
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 » KursyKurs WinSock, C++ kurs. 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.
P-22500
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...
P-22502
DejaVu
» 2010-09-30 15:59:39
Allegro jest po prostu banalne w porównaniu do komunikacji sieciowej :)
P-22513
malan
» 2010-09-30 16:41:01
Nie znam Qt, ale może wyzeruj tą zmienną:
QByteArray data;
.
P-22520
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:

C/C++
void MainWindow::on_pb_send_clicked()
{
    wyslij();
}

podobnie mialem wcisnicie pb_send, a oprocz tego tak jakbym dopisal gdzies jeszcze:

C/C++
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 :) )
P-22563
« 1 »
  Strona 1 z 1