Psat server v qt nebo c++ socketech – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Psat server v qt nebo c++ socketech – C / C++ – Fórum – Programujte.comPsat server v qt nebo c++ socketech – C / C++ – Fórum – Programujte.com

 

martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #1
-
0
-

Zdravím,chtěl bych si udělat chat
server, k němu by byli připojeni
klienti,klient bude vytvořený v QT v
tom mám jasno,ale se serverem si
nevím rady. Potřeboval bych poradit
jestli je dobré dělat server taky v QT
nebo použít holé sockety,co bude
vhodnější a jednodušší? Dál je to
možná na mě příliš velké sousto.
Server by měl být tak pro 30 lidí,bude
na to stačit jedno vlákno?Nebo mám
udělat jedno pro příjem,druhé pro
zpracování a třetí pro odesílání jak
jsem někde četl? A mám použít
blokující nebo neblokující režim
socketu? Asi neblokující ale nejsem si
jistý. Moc děkuji za odpovědi.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.230.–
KIIV
~ Moderátor
+43
God of flame
9. 9. 2012   #2
-
0
-

pokud bys pouzil jedno vlakno tak spis neblokujici.. kazda chyba by te stala zablokovani na hodne dlouho

kazdopadne vic zalezi na mnozstvi requestu a jejich velikost (jestli se to bude dat stihat)

a nebo pouzit treba asynchronous io z boostu - usetri se spousta trapeni s tim zpracovanim

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
9. 9. 2012   #3
-
0
-

Qt je na server asi zbytečnost, ale pokud zahrnuje i nějaké rozšíření pro práci se sokety, tak klidně. Nakonec třeba i na to serveru budeš potřebovat okno s nastavením apod. No a jaký režim? Pokud to děláš pod wokny, asi tam je možný režim, kdy si zaregistruješ zprávu, která se volá při spojení, čtení, ukončení spojení apod. Jinak samozřejmě neblokující režim. Na chatu není žádný ohromný tok dat, takže klidně všechny do jednoho vlákna. A tvém případě se 30 klienty si to můžeš rozhodit na co klient to vlákno. Ono je to totiž při tak malém počtu jedno :)

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.230.–
ingiraxo+15
Grafoman
9. 9. 2012   #4
-
0
-

v Qt se tcp připojení řeší automaticky asynchroně.. tohle připojení ti utáhne bez problému i 200 lidí i víc, záleží k čemu přesně server bude sloužit (aspoň předpokládám, že znáš problematiku signal/slot)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #5
-
0
-

dekuju moc za odpovedi,problematiku signal/slot znam a asi bude nejlepsi resit to v qt. Jsem stale zacatecnik,a tak me napadl asi posledni dotaz,je to spis blbost na kterou znam odpoved ale jen pro ujisteni. Bude pro kazdy pocitac potreba samostatny socket? jak to resit? mam to resit pres pole socketu nebo neco vhodnejsiho je?

Nahlásit jako SPAM
IP: 193.165.245.–
ingiraxo+15
Grafoman
9. 9. 2012   #6
-
0
-

každý připojení má soket, čili z 1PC může být tisíce připojení = soketů, musíš někde mít pole klientů, který budou připojení k serveru

největší problém budeš mít se zabezpečením, není problém na dálku shodit server

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
9. 9. 2012   #7
-
0
-

na linuxu muze mit technicky vzato maximalni pocet filedescriptoru na proces (obvykle 1024) z cehoz nejmene 3 jsou uz urcite zabrany na standardni vstup/vystup/chybovy vystup + server socket ... absolutni maximum na system je tusim par stovek tisic (opet zalezi na nastaveni a tak - muze to byt mnohem mene - napriklad na starych unixech a podobne)

ale pro windows sem tydle limity nestudoval - kazdopadne se da podivat na omezeni prikazu select - bude to odpovidat omezeni procesu (select musi zvladnout zpracovat vsechny descriptory, co muze proces mit - a jelikoz je to jen bitove pole, nemuze jich byt nejak zvlaste moc)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #8
-
0
-

Aha,takze ze bych mel pole 30 socketu pripravenych pro maximalne 30 lidi by neslo ze?

Nahlásit jako SPAM
IP: 193.165.245.–
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #9
-
0
-

jeste jednou dekuju za odpovedi,moc mi pomahaji. 

Nahlásit jako SPAM
IP: 193.165.245.–
ingiraxo+15
Grafoman
9. 9. 2012   #10
-
0
-

nikdy nepřipravuj sokety.. vždy to řeš dynamicky ať zbytečně nezabíráš paměť a je to i snažší obsluha pak

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #11
-
0
-

takze asynchronni spojeni na 1 vlakno ,takhle bych to zatim udelal. je to dobry,pouzitelny zpusob?

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.231.–
ingiraxo+15
Grafoman
9. 9. 2012   #12
-
0
-

pokud zavoláš něco async. tak to automaticky leze do separátního vlákna (většinou to je vlákno na pozadí, že funguje jako služba)... asynch. naslouchání bohatě stačí pro tisic a víc připojení otázkou pak je, jak je vytížená manipulace s IO daty na streamu a ty můžou toto vlákno zatěžovat, proto se ve většině případěch používá ještě ThreadPool pro vykonání této činosti (ale pokud to máš stylem chat, tak tohle klidně ignoruj, to je spíše pro větší přenosy a s větším vytížení serveru)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #13
-
0
-

nekde sem videl pouzit na vice socketu QMap. Je to dobra volba? nebo ze by QVector? v tomhle sem jeste zacatecnik.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.231.–
crazy
~ Moderátor
+10
Grafoman
9. 9. 2012   #14
-
0
-

#13 martin
QMap asi ne... spíš QList nebo QVector, podle toho, jak chceš k těm soketům přistupovat...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
ingiraxo+15
Grafoman
9. 9. 2012   #15
-
0
-

tak QMap může tak použít a ten se mi i celkem osvědčil, protože klíč můžeš dát handle socketu a lépe se v tom hledají klienti (aspoň mě to tak přislo)

martin: ze začátku stejně uděláš plno kopanců, takže to udělej tak, jak si mysliš že to bude a postupem času to můžeš optimalizovat

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #16
-
0
-

jedno z tech 3 pouziju,ale uz ted to pomohlo tak ze sem prestal uvazovat o poli socketu.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.231.–
martin
~ Anonymní uživatel
1602 příspěvků
9. 9. 2012   #17
-
0
-

jaky je rozdil mezi qvector a qlist? o stl byl tutorial na builderu a byly tam taky,vector to chapu to je jako jednorozmerne pole ale list nechapu,ktery z nich by ste mi doporucili vic?

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 217.212.230.–
yaqwsx+9
Posthunter
10. 9. 2012   #18
-
0
-

#17 martin
vector je "pole" - položky jsou fyzicky v paměti za sebou. Tzn. může přistoupit ke kterékoliv položce vektoru. Pokud však mažeš nebo přidáváš jinde, než na začátku nebo na konci vektoru, musí všechny položky přesouvat.

list je spojový seznam - položky nejsou fyzicky v paměti za sebou. A vždy z jedné položky můžeš přistoupit na následující nebo na předchozí - nelze přistoupit např. na položku s indexem 5. Výhodou je, že můžeš mazat a přidávat položky kdekoliv v listu s konstantní časovou náročností.

Nahlásit jako SPAM
IP: 85.160.40.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #19
-
0
-

#18 yaqwsx
ne tak uplne ... pokud mas primo iterator ktery smazat, tak to ma opravdu konstantni mazani v listu - ale pokud nemas, tak se prvek musi najit... a u velkeho mnozstvi dat narazis na "nepredvidatelnost" umisteni v pameti a tudiz velice casty znovunacitani procesorovy cache... (a to trva stovky instruknich cyklu procesoru)

ale samozrejme to je vic znat hlavne pro velke pole v radech statisicu prvku...

nahodny pridavani a mazani pak vyjde stejne rychleji ve vectoru nez v listu

(viz prednaska o c++11 od Bjarne Stroustrupa http://www.youtube.com/watch?v=OB-bdWKwXsU cas 44:40)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
martin
~ Anonymní uživatel
1602 příspěvků
10. 9. 2012   #20
-
0
-

takze lepsi bude qvector abych mohl pristupovat k jakemukoliv socketu?

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.239.243.–
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #21
-
0
-

#20 martin
zalezi na pouziti... pokud budes mit jen seznam klientu a kdyz ti z nejakeho prijdou data, tak je budes chtit poslat na vsechny ostatni, vector bude v pohode - i list bude mit polozky vcelku u sebe, takze zadny velky rozdily nebudou

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
10. 9. 2012   #22
-
0
-

#21 KIIV
co si myslíš o QMap, kdyby měl klíč jako handle soketu nebo jméno (login) klienta, tak by vyhledání klienta mělo být teoreticky rychlejší a odebrání klienta by se mělo chovat stejně jako u vektoru

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #23
-
0
-

#22 ingiraxo
U map je nejpomalejsi/nejnarocnejsi prochazeni (traverzace) pres vsechny prvky ... takze opravdu zalezi na pouziti - vyhledavani a podobne je super

(ikdyz pokud se pouzije binarni hledani nad serazenym vektorem tak tam nebudou zase velke rozdily - mozna zase nad velkym mnozstvim dat a prochazenim vsech prvku poporade)

(mimochodem mluvim o STL - ale nepredpokladam ze ty QT implementace budou nejak zvlast jine)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
10. 9. 2012   #24
-
0
-

#23 KIIV
ono Qt podle mě jen kopíruje objekty z STL, osobně jsem nenašel žádnej rozdíl mezi třeba vector a QVector

takže by se dalo říct, že pro server typu chatu, kde se zpráva (skoro vždy) odesílá všem připojeným, je podstatě vektor nejlepší řešení... a pro server, kterej spíše komunikuje s klienty separátně a vyjmečně odesílá zprávu všem, tak použít mapu

ale ve výsledku bude stejně rozdíl skoro zanedbatelnej, i na 1000 klientů je iterace pro CPU skoro nic

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #25
-
0
-

#24 ingiraxo
pro ty mnozstvi dat a predpokladanou zatez je prakticky jedno co se pouzije...  ta gradace vykonu je poznat az pro desetitisice prvku ... maly pole se klidne do cache vejde (+ nebudou prvky ani daleko od sebe)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
martin
~ Anonymní uživatel
1602 příspěvků
10. 9. 2012   #26
-
0
-

dekuju moc,spis by si to meli lidi psat mezi sebou a ne to posilat vsem,na to bude lepsi mapa ze? tak dekuju moc,asi pouziju mapu. 

Nahlásit jako SPAM
IP: 195.246.54.–
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #27
-
0
-

#26 martin
ono mozna bude lepsi mit napriklad prezdivku jako klic te mapy.. kdybys dostal casem napad hodit tam i privatni zpravy :D nebo nejaky kod (treba ip, porty a tak)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
martin
~ Anonymní uživatel
1602 příspěvků
11. 9. 2012   #28
-
0
-

Jo to mel byt puvodni zamer,posilat privatni zpravy jenom. Na to bude asi nejlepsi mapa,tak dam se do prace a potom napisu dalsi problemy,jeste jich bude. Dekuju moc,bez tohohle bych na pouziti mapy neprisel a trapil bych se s nejakym polem

Nahlásit jako SPAM
IP: 78.102.31.–
martin
~ Anonymní uživatel
1602 příspěvků
15. 9. 2012   #29
-
0
-

Tak uz sem o kousek dal a hned sem narazil na problem. Zatim to mam tak ze pri novem spojeni se vytvori socket,z neho se precte prezdivka a prezdivka jako klic se spolu se socketem jako typem ulozi do mapy. takhle bych nasbiral tech nekolik klientu ale jak od vsech soucasne naslouchat jestli neprisla zprava? 

Nahlásit jako SPAM
IP: 78.102.31.–
martin
~ Anonymní uživatel
1602 příspěvků
15. 9. 2012   #30
-
0
-

 Tady je zdrojovy kod. server.cpp:

#include "server.h"
server::server (QWidget* parent):QWidget (parent)
{
prijem=new QTcpServer (this);
hostAddress=QHostAddress ("192.168.0.103");
prijem->listen (hostAddress,25000);
socket=new QTcpSocket ();
sockety=QMap <QString,QTcpSocket *> ();
connect (prijem,SIGNAL (newConnection ()),this,SLOT (vytvorSlot()));
}
void server::vytvorSlot ()
{
socket=prijem->nextPendingConnection ();
connect (socket,SIGNAL (readyRead()),this,SLOT (startRead()));
socket->write ("LOGIN");
rawdata = socket->readAll();
prezdivka=rawdata;
sockety.insert (prezdivka,socket);
}

void server::startRead ()
{
	QTcpSocket* socket = qobject_cast<QTcpSocket*>(this->sender());
// požadavek
	 rawdata = socket->readAll();
	// argumenty požadavku
	 args = rawdata.split(' ');
	// samotný příkaz
	 command = args.takeFirst();
	qDebug() << rawdata;
	

}

server.h:

#ifndef _SERVER_H
#define _SERVER_H
#include <qtcpserver.h>
#include <qtcpsocket.h>
#include <qabstractsocket.h>
#include <qapplication.h>
#include <qwidget.h>
class server:public QWidget
{
	Q_OBJECT
private:
	QTcpServer * prijem;
	QHostAddress  hostAddress;
	QTcpSocket * socket;
	QStringList tokens;
	QByteArray rawdata;
	QList<QByteArray> args;
	QMap <QString,QTcpSocket *> sockety;
	QString command;
	QString prezdivka;
public:
	server (QWidget* parent=0);
	public slots:
		void vytvorSlot ();
		void startRead ();
};
#endif

je to naslouchani na novou zpravu spravne? Neni to uz vyresene? nejsem si moc jisty.

Nahlásit jako SPAM
IP: 78.102.31.–
ingiraxo+15
Grafoman
15. 9. 2012   #31
-
0
-

nejlepší je, když si podědíš přímo QTcpServer a upravíš podle potřeby.. pošlu hlavičku, kterou jsem dělal asi tak před 1-2 rokama (jsem našel na disku ještě) .. treba ti to nejak pomuze

#ifndef TcpServer_H
#define TcpServer_H

#include "Client.h"
#include "Packet.h"

#include <QObject>
#include <QTcpServer>
#include <QSet>

class TcpServer : public QTcpServer
{
    Q_OBJECT

public:
    TcpServer(QTcpServer* parent = 0);
    void start();
    void stop();
    void disconnectAll();
    void announce(const QByteArray data);
    void send(const int handle, const QByteArray data);
    void kick(const int handle, const QByteArray reason = 0);
    QByteArray clientList() const;
    Client* findClient(const int handle);
    int ClientsCount() const;
    int MaxClients() const;
    void setMaxClients(const int max);
    ushort Port() const;
    void setPort(const ushort port);
    QList<Client*> Clients() const;

private slots:
    void OnClientDisconnect(Client* client);
    void OnClientRead(Client* client, const QByteArray data);

signals:
    void ClientConnected(Client* client);
    void ClientDisconnected(Client* client);
    void ClientRead(Client* client, Packet packet);
    void MaxClientsReach(Client* client);

protected:
    void incomingConnection(int handle);

private:
    QSet<Client*>* iClients;
    int iMaxClients;
    ushort iPort;

    void sendGlobal(const QByteArray data);
};

#endif // TcpServer_H

jinak pro čtení dat od každého klienta musis hned po jeho pripojeni navazat cteni a bude to fungovat asynchrone pro kazdyho klienta zvlast.. takze neco jako

connect(client, SIGNAL(Read(Client*,QByteArray)), this, SLOT(OnClientRead(Client*,QByteArray)));

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
13. 10. 2012   #32
-
0
-

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.  

Nahlásit jako SPAM
IP: 94.112.154.–
ingiraxo+15
Grafoman
13. 10. 2012   #33
-
0
-

vytvoř si paket system, kde budeš odesílat rovnou celý segmenty a né takto na části... např. {flag;msg} pokud flag bude login (třeba 0x100), tak odešlat paket ve tvaru {0x100,{user;pass}}

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
martin
~ Anonymní uživatel
1602 příspěvků
13. 10. 2012   #34
-
0
-

dekuju moc, zkusim a napisu jak to dopadlo

Nahlásit jako SPAM
IP: 94.112.154.–
martin
~ Anonymní uživatel
1602 příspěvků
21. 10. 2012   #35
-
0
-

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

Nahlásit jako SPAM
IP: 94.112.154.–
ingiraxo+15
Grafoman
21. 10. 2012   #36
-
0
-

#35 martin
je to dobře, jen bych místo třídy použil struktůru a flagy dej jako unsigned int

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
25. 10. 2012   #37
-
0
-

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? 

Nahlásit jako SPAM
IP: 94.112.154.–
ingiraxo+15
Grafoman
25. 10. 2012   #38
-
0
-

tohle si už musíš analyzovat v readu o co přesně jde a jak se má chovat server... důležitý tady je, aby si nějak dokázal identifikovat paket

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
8. 11. 2012   #39
-
0
-

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? 

Nahlásit jako SPAM
IP: 94.112.154.–
ingiraxo+15
Grafoman
8. 11. 2012   #40
-
+1
-
Zajímavé

hlavní rozdím mezi sync a async je ten, že program nečeká, až se async funkce dokončí, ale pokračuje vesele dál

kdyby si např. posílal 5MB soubor a měl by si to řešený sync, tak se program blokne do doby, dokud se soubor neodešle (což bude v řádech několika sekundách => selhání serveru)

readyRead v Qt by se měl automaticky vykonávat async, dneska je podle mě blbost dělat server sync, pokud teda neslouží čistě na chat, kde posíláš jen zprávy, tam je to celkem jedno

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
9. 11. 2012   #41
-
0
-

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

Nahlásit jako SPAM
IP: 94.112.154.–
ingiraxo+15
Grafoman
9. 11. 2012   #42
-
0
-

Qt jsem už tak 3/4 roku neotevřel, ale v tomhle snad chyba udělat nejde, prostě server začne naslouchat a jakmile se připojíš klientem, tak ho uložíš do nějakýho listu připojených a ted důležitá věc... začneš hned při připojení u soketu neslouchat a teď jakmile něco odešles klientem, tak se ti to na serveru zobrazí

samozřejmě klient je stále připojen, dokud se neodpojí nebo ho server nevykopne

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý