Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Qt: Socketit

Sivun loppuun

kayttaja-3842 [06.01.2011 21:09:48]

#

Tervehdys kaikki,

Elikkäs olen väsäämässä testinä QT:lla serveri <-> client tiedonsiirto softaa. Törmäsin vain nytten yhteen ongelmaan. Elikkäs ongelmani on, että kun lähetän serveriltä peräkanaa 1024 kokosia paketteja, niin clientti hävittää ne?

Eli jos laitan suoraan vaikkapa:

sendData( data, 1024 ); //Tämän ekan se löytää
sendData( data, 1024 ); //Tätä ei
sendData( data, 1024 ); // Tätä ei

Eli Clientti palauttaa readyRead() signaalin vain kerran vaikka pitäisi palauttaa kolme kertaa, koska dataa tulee letkusta kolme kertaa. Jos taas laitan timerin lähettämään paketit sekunnin välein, niin kaikki data tulee perille? Eli siis hävittääkö QT QTcpSocket datan jotenki jos dataa tulee liian nopeasti?

Kokeilin vielä senkin verran, että yhdistin serverilleni telnetin kautta ja siellä kyllä data tulee hienosti 3 paketissa. Eli Clientissä on nyt joku vika, mutta mikä? :O

Metabolix [06.01.2011 21:12:35]

#

TCP-yhteydessä ei ole "paketteja", vaan data tulee yhtenäisenä virtana. Jos haluat käsitellä sen jonkinlaisina paketteina, sinun pitää lähettää joka paketin alussa sen pituus (ellei pituus ole aina sama) ja toisessa päässä vastaanottaa dataa puskuriin siihen asti, että määrätty koko on saatu kasaan.

kayttaja-3842 [06.01.2011 21:27:03]

#

Juuri näin teenkin, että lähetän datat aina 1024 kokosina "paketteina" joka luetaan sitten clientistä readData( data, 1024 ). Itse data sitten sisältää int(koko) + data(muuroska). Elikkäs koko on sitten, sitä varten, että jos paketin koko ei olekkaan 1024, niin osataan lukee sitten oikea määrä dataa ettei liikaa lueta.

Metabolix [06.01.2011 21:55:17]

#

Niin, no kelpaisiko ratkaisuksi, että lisäät readyRead-käsittelijään silmukan?

while (bytesAvailable() >= 1024) {
    // Lue ja käsittele seuraavat 1024 tavua.
}

kayttaja-3842 [06.01.2011 22:22:20]

#

Itsekkin katselin tuota jo aikasemmin, mutta ei tuo auta. palauttaa ekan "paketin" tullessa hienosti, että dataa on luettavissa 1024 ja sen jälkee palauttaa 0, joka taas johtuu siitä, koska Clientti ei jostain syystä edes saa niitä seuraavia paketteja tai jos saa, niin häivittää ne jonnekkin. Minusta vaikuttaa sitlä, että tässä tapahtuu nytte niin, että ekan paketin tullessa ohjelma palauttaa readyRead signaali ja lukiessa dataa ei kerkee kahta seuraavaa lueka tjt. En oo varma, mutta tätä arvelua tukee se, että jos laitan paketit lähtemään sekunnin välein, niin clientti saa kaiken lähetyn datan.

Metabolix [06.01.2011 22:23:36]

#

Miten tarkalleen luet datan? Laita nyt vähän koodia edes.

jalski [10.01.2011 11:30:04]

#

kayttaja-3842 kirjoitti:

Juuri näin teenkin, että lähetän datat aina 1024 kokosina "paketteina" joka luetaan sitten clientistä readData( data, 1024 ). Itse data sitten sisältää int(koko) + data(muuroska). Elikkäs koko on sitten, sitä varten, että jos paketin koko ei olekkaan 1024, niin osataan lukee sitten oikea määrä dataa ettei liikaa lueta.

Lähetätkö testi "paketit" tuon 1024 tavua pituisina?

Ettei vaan nyt olisi kuitenkin niin, että tuo lähettämäsi tavara tulee kaikki oikeasti yhdessä pötkössä perille? Meinaan vaan, että jos kaikki lähettämäsi tavara oikeasti mahtuukin tuohon 1024 tavun vastaanottopuskuriin ja haet tuosta puskurista kuitenkin silti vain pelkän ensimmäisen lähetyksen?

Tätä arvailua tukee se, että sanot lähetettäessä tavaraa ajastetun viiveen kanssa vastaanoton toimivan toisessa päässä oikein.

Tuoppia [10.01.2011 16:55:50]

#

jalski taitaa olla aikeassa.
readyRead-signaali lähetetään vain kerran, silloin kun uutta tavaraa on luettaviSSA, ei silloin kun "paketti" on vastaanotettu. Eli kun lähetät kolme "pakettia" putkeeen, ne tulee vastaanottopäähän yhtenä pötkönä ja readyRead lähetetään vain kerran.

Katsele Fortune Clien Examplen koodia Qt Demosta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta