Netwerk design vraagje

Pagina: 1
Acties:

  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
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:
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

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 22-05 13:09
http://doc.trolltech.com/3.2/qsocket.html

Kijk bij "Signals". Er zijn signals voor de events connected, data available, error, etc.

Daarnaast zou je wel threads kunnen gebruiken hoor, zeker geen flauwekul.

  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
Het probleem is dat ik 'direct' antwoord wil hebben als ik bv. inlog, en dit niet in allerlij functies wil storten.
Daar komt ook nog bij dat ik verschillende delen van het programma wil laten werken met één centrale verbinding.

  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
Heb nu dit geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
programma
|
|
 ----> ClientSocket::send(thedata)
        |
        |
        {
            TransferThread writeThread(this);
            TransferThread readThread(this);

            writeThread.write(thedata); ------> start()
                                        |  << thread
                                        TransferThread::run()
                                        |
                                        |       {
                                                    socket->write(thedata);
                                        |       }

            return readThread.read() ------> start()
                                        | << thread 2
                                        TransferThread::run()
                                        |
                                        |       {
                                        |           socket->waitForMore(-1); // UNIX select()
                                        |           socket->read();
                                        |       }
                                         ----> wait();
        }

Hoop dat dit een beetje duidelijk is ;-)
(Er wordt dus NIET ge-wait() bij de write-thread)

Het resultaat:
- Server ontvangt NIETS
- Programma blokkeerd (logisch omdat de server niks terug kan sturen)

HELP!