Hallo,
Ik ben bezig met een programma gebaseerd op het client-server princiepe.
De server is al redelijk beta, dus die kunnen we verder buiten beschouwing laten.
De client moet gaan werken met de socket API van Qt, alleen geeft dit nogal wat nogal wat probs.
De server verwacht een command en een optioneel argument.
de eerst drie letters vormen de commando code, daarna volgt een argument.
Als ik dit in telnet probeer (met de server draaiende dus) gaat het best aardig:
Nu komt het probleem: voor een GUI progsel wordt (uiteraard) non-blocking I/O aangeraden.
Maar als ik een 'functie' wil uitvoeren op de server, krijg ik geen real-time antwoord.
Bv.
Ook een vergelijkbaar 'flush' commando na elke write() bewerking levert niets op.
Is er een elegante oplossing voor dit probleem? of moet ik dit soort rotzooi uit gaan halen:
socket->write("100");
while(!socket->bytesAvailable()) { }
cout << socket->read(); ... enz
(hetgeen dus ook niet werkt)
Nu kan ik wel met timers, threads en andere flauwekul aankomen:
Maar ik vraag me af of dit zinvol is.....
Bedankt,
Barry
Ik ben bezig met een programma gebaseerd op het client-server princiepe.
De server is al redelijk beta, dus die kunnen we verder buiten beschouwing laten.
De client moet gaan werken met de socket API van Qt, alleen geeft dit nogal wat nogal wat probs.
De server verwacht een command en een optioneel argument.
de eerst drie letters vormen de commando code, daarna volgt een argument.
Als ik dit in telnet probeer (met de server draaiende dus) gaat het best aardig:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| bash-2.05a$ telnet 127.0.0.1 1710 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Welcom to Edukitty Server! 100 200 Ready 110 foo 201 OK 171 241 Edukitty Network Database Server 1.1.4 101 202 Bye bye Connection closed by foreign host. bash-2.05a$ |
Nu komt het probleem: voor een GUI progsel wordt (uiteraard) non-blocking I/O aangeraden.
Maar als ik een 'functie' wil uitvoeren op de server, krijg ik geen real-time antwoord.
Bv.
code:
1
2
3
4
5
6
7
| // Pseudo-Pseudo code ;-)
if(!socket->connect(host, port))
return; // Werkt dus niet, aangezien het connecten nog 'bezig' is.
socket->write("100");
cout << socket->read(); // Werkt dus ook niet. |
Ook een vergelijkbaar 'flush' commando na elke write() bewerking levert niets op.
Is er een elegante oplossing voor dit probleem? of moet ik dit soort rotzooi uit gaan halen:
socket->write("100");
while(!socket->bytesAvailable()) { }
cout << socket->read(); ... enz
(hetgeen dus ook niet werkt)
Nu kan ik wel met timers, threads en andere flauwekul aankomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class Lame
{
Lame()
{
connect(socket, SIGNAL(readReady()), this, SLOT(isReady()));
}
void isReady()
{
b =true;
}
void waitForData()
{
while(!b) { }
b =false;
}
QSocket socket;
bool b;
}; |
Maar ik vraag me af of dit zinvol is.....
Bedankt,
Barry