porad se mi nedari vyresit problem s tim ze neprecte zpravy :( nenapada te jak to vyresit prosim? se sitovymi programy moc zkusenosti nemam,nenapada me proc to nefunguje
Příspěvky odeslané z IP adresy 94.112.154.–
Ahoj,tak premyslim nad tim a asi bude potreba vratit se na zacatek. Nejlip k otazce blokujici vs neblokujici funkce a synchronni vs asynchronni rezim . Co bude nejlepsi? nekde se tady psalo ze pri zpusobu jakym mam server napsany ja se automaticky vytvari nove vlakno,jde v tomto pripade pouzit blokujici funci bez toho ze by to nejak omezovalo funkcnost? co si mam predstavit pod blokujici funkci? ze vlakno vytuhne do doby nez je packet bezpecne poslan? bude fungovat GUI a prijimani dalsich pozadavku? jestli se pro kazdy socket automaticky vytvari nove vlakno tak by to melo se melo bloknout jen to urcite vlakno a cinnost GUI by nemela byt prerusena,nebo se pletu? mam v tom dost zmatek a stavajici reseni se mi prestava libit,zatim je to tak ze klient se pripoji na server,server odesle prikaz k prihlaseni,klient posle prihlasovaci udaje ale ty uz server nedostane. ani se nevyhodi signal readyread ,nic. napada vas cim to je?
záleží na platformě a nastavení cest ale tohle by mohlo fungovat
gcc -o main main.cpp `sdl-config --cflags --libs` -lSDL_image
Dekuju moc :) dokud nenarazim na chybu zustanu u visual studia ale nainstaluju 2012 a uvidim jak to dopadne :)
Takze visual c++ je na tom hur?
Ahoj,programuju už pár let a dosud sem používal Visual C++,v poslední době ale začínám uvažovat nad gcc (mingw) . Který překladač je kvalitnější,má větší podporu standardů a je rychlejší? Nedávno sem přečetl tohle http://babel.blog.root.cz/2012/06/03/microsoft-a-c11/ a nevím jistě jestli je visual c++ tak dobr´jak se tvrdí. Děkuju za odpovědi.
Zkousel sem to ale napada me.. vyresi to ten muj problem? nezustane porad to ze server nedokaze rozlisit kdy konci jeden prikaz,data pro prvni prikaz a zacina druhy prikaz?
Ahoj,vyzkousel sem vymyslet ten packet system. Je dobry napad udelat to jako tridu napr.
class packet
{
private:
int flag;
QByteArray data;
public:
packet (int flag,QByteArray data);
dalsi funkce,gettery,settery apod.
}
slo by to takhle? nebo je to od zacatku spatne? hodnoty flagu by byly ulozeny jako enum
dekuju moc, zkusim a napisu jak to dopadlo
Ahoj,po delsi dobe sem tu s novym problemem. Uz to mam vice mene vyresene ale narazil sem na problem. Server po pripojeni noveho pocitace posle "LOGIN",vyzvu aby se prihlasil. na to mu klient odpovi "LOGINING" a pripravi jmeno a heslo k poslani. Problem je ze misto toho aby se poslalo nejdriv LOGINING a potom teprv jmeno s heslem tak se to posle dohromady. Kod je zde:
okno::okno (QMainWindow* parent):QMainWindow (parent)
{
dialog=new dialogPrihlaseni ();
textEdit=new QTextEdit ();
textBrowser=new QTextBrowser ();
odeslat=new QPushButton ("odeslat");
vertikalniLayout=new QVBoxLayout ();
horizontalniLayout=new QHBoxLayout ();
boxPrihlaseniLidi=new QComboBox ();
horizontalniLayoutWidget=new QWidget ();
vertikalniLayoutWidget=new QWidget ();
msgVysledekPrihlaseni=new QMessageBox ();
prijem=new QTcpServer ();
socket=new QTcpSocket ();
socketOdesilani=new QTcpSocket ();
connect (dialog,SIGNAL (spusteno()),SLOT (zjistiUdaje ()));
nastavLayout ();
setCentralWidget (vertikalniLayoutWidget);
}
void okno::zjistiUdaje ()
{
jmeno=dialog->dejJmeno ();
heslo=dialog->dejHeslo ();
nastavPripojeni ();
}
void okno::nastavPripojeni ()
{
adresa=QHostAddress ("192.168.0.101");
prijem->listen (adresa,25000);
socketOdesilani->connectToHost (adresa,25000);
connect (socketOdesilani,SIGNAL (readyRead()),this,SLOT (startRead()));
}
void okno::startRead ()
{
//QTcpSocket* socket = qobject_cast<QTcpSocket*>(this->sender());
rawdata = socket->readAll();
args = rawdata.split(' ');
command = args.takeFirst();
qDebug() << rawdata;
if (command.compare ("LOGIN"))
{
write ("LOGINING");
prezdivkaPoslani=QString (jmeno);
prezdivkaPoslani.append ("////");
prezdivkaPoslani.append (heslo);
socketOdesilani->write (prezdivkaPoslani.toAscii (),qstrlen (prezdivkaPoslani.toAscii()));
socketOdesilani->flush ();
socketOdesilani->flush ();
}
if (command.compare ("LOGINOK"))
{
uspesnePrihlaseni=true;
msgVysledekPrihlaseni->setText ("Prihlaseni probehlo spravne.");
msgVysledekPrihlaseni->setWindowTitle ("Vitejte");
//dialog->hide ();
}
if (command.compare ("LOGINFALSE"))
{
msgVysledekPrihlaseni->setText ("prihlaseni se nezdarilo.Zadejte spravne jmeno a heslo");
msgVysledekPrihlaseni->setWindowTitle ("chyba!");
uspesnePrihlaseni=false;
}
if (command.compare ("READ"))
{
//precteni zpravy
}
}
void okno::nastavLayout ()
{
horizontalniLayout->addWidget (textEdit);
horizontalniLayout->addWidget (boxPrihlaseniLidi);
horizontalniLayout->addWidget (odeslat);
vertikalniLayout->addWidget (textBrowser);
horizontalniLayoutWidget->setLayout (horizontalniLayout);
vertikalniLayout->addWidget (horizontalniLayoutWidget);
vertikalniLayoutWidget->setLayout (vertikalniLayout);
}
void okno::write (QByteArray data)
{
socketOdesilani->write (data);
socketOdesilani->flush ();
}
neni dodelany ale k popisu problemu staci. Pouzivam flush spravne? myslel sem ze slouzi k okamzitemu zapisu dat. Nejak si s tim nevim rady,server dostane misto "LOGINING" a potom jmena a hesla,tak to vsechno dostane dohromady a takhle by to asi nemelo byt. Mate nejake rady na zlepseni? Dekuju za odpovedi.