Tema: Qt client - server
Mogoče se tudi tu kdo najde, ki programira v Qt...
Da ne bom na široko razlagal celotnega problema bom prilepil kar link, kjer sem ga opisal:
link...
Hvala za vsakršno pomoč (oz. vsaj kakšno idejo)
![]() |
|
Uradna spletna stran slovenske skupnosti Linux distribucije Ubuntu
Niste prijavljeni. Prijavite se ali se registrirajte.
Strani 1
Za vpis odgovora je potrebna prijava ali registracija
Mogoče se tudi tu kdo najde, ki programira v Qt...
Da ne bom na široko razlagal celotnega problema bom prilepil kar link, kjer sem ga opisal:
link...
Hvala za vsakršno pomoč (oz. vsaj kakšno idejo)
send() ne zagotavlja, da bo poslal celotno sporočilo do prejemnika. za to moraš ti poskrbet. Preveri koliko bajtov je že poslano in od tega lahko prečitaš koliko jih še moraš poslat. Enako velja za recv(). Sproti preverjaj koliko si že sprejel.
Pazi...
Jaz v clientu uporabim
qint64 QIODevice::write ( const QByteArray & byteArray )
Ta funkcija na server side proži signal readyRead(), ki je povezan s slotom receiveMessage(). V tem slotu že preverjam količino prejetih bytov. Če v ta slot postavim števec ugotovim, da se slot sploh ne sproži tolikokrat kot mi client pošlje sporočillo. Sedaj ne vem, ali client teh sporočil sploh ne pošlje ali se kje izgubijo ali pa jih server ne prestreže. Naj omenim še, da client in server tečeta trenutno na istem računalniku, tako da ni neke bojazni za packet lost.
Še to... V clientu zgornja funkcija (write) vrača število poslanih bytov. In to število se ujema z velikostjo dejanskega (QByteArray) sporočila. Iz tega lahko sklepam, da sporočilo dejansko je poslano.
Nazadnje urejal frido (03.04.2009 09:12:31)
hm požen wireshark pa opazuj pakete. mogoče se vmes pojavi kaj čudnega.
Na spodnjem linku je tcpdump (oz. screenshot wireshark-a) v primeru, ko sem iz clienta poslal 10 sporočil, na server pa sem prejel samo eno. Če sem čisto odkrit, mi izpis ne pove kaj dosti razen tega, da je client dejansko poslal 10 sporočil, ter to da me moti v izpisu "TCP CHECKSUM INCORRECT". Prosim te, če si tako dober in si pogledaš izpis. Mogoče bo tebi kaj več jasno
Hvala
Še link
zgleada vse vredu, client pošlje 10 paketov in server vseh 10 potrdi. tist crc error lahk ignoriraš ker se pravi crc ustvari na hardwerskem nivoju in wireshark ne more dobiti prej pravega crc-ja. drugače pa nevem. na tem nivojem zgleda vse ok.
Našel vzrok težave!
Problem tiči v tem, da sama write() funkcija ne pošlje podatkov direktno "na kabel" ampak jih preda kernelu (logično). Če ti podatki prihajajo do kernela prehitro (brez pavze), se jih ta odloči združiti in jih poslati v enem kosu.
Tega nisem predvidel (tako kot pri TrollTechu tega niso omenili nikjer v dokumentaciji).
Malenkost sem spremenil ServerThread::receiveMessage() (upoštevajoč zgoraj napisano) in stvar deluje.
Celotna rešitev je tukaj (če se bo slučajno kdo srečal s podobnim primerom).
Hvala za pomoč!
sicer se to lahko delno popravi. lahko ročno povečaš send buffer. send buffer se lahko napolni že ob enkratnem klicu, če so padatki preveliki za njega. v tem primeru send() vrnne manjšo velikost poslanih bajtov kot jih ti zahtevaš ob klicu.
Sporočil [ 8 ]
Strani 1
Za vpis odgovora je potrebna prijava ali registracija
Powered by PunBB
[ Zgenerirano v 0,095 sekundah, 6 izvedenih ukazov. ]