Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Netwerk design vraagje

Wim Sturkenboom
5 antwoorden
  • 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:839d68fba5]
    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$
    [/code:1:839d68fba5]

    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:839d68fba5]
    // 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.

    [/code:1:839d68fba5]

    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:839d68fba5]
    class Lame
    {
    Lame()
    {
    connect(socket, SIGNAL(readReady()), this, SLOT(isReady()));
    }

    void isReady()
    {
    b =true;
    }

    void waitForData()
    {
    while(!b) { }
    b =false;
    }

    QSocket socket;
    bool b;

    };
    [/code:1:839d68fba5]

    Maar ik vraag me af of dit zinvol is…..

    Bedankt,
    Barry
  • Threads -> flauwekul?

    Gewoon threads gebruiken. Een thread die de socket leest en die data verwerkt. Dan kan je in de rest van het programma dingen verzenden.
  • Je zult wel moeten vriend :D

    Je weet immers nooit wanneer je data terugkrijgt. Op het moment van executie roept jouw programma 1 keer de read-call aan. Dit is op een willekeurig tijdtip en de data kan net zo goed pas 1 ms later beschikbaar zijn.

    Je zult dus in een loop/thread whatever continue moeten controleren of er data beschikbaar is (read) en hier vervolgens wat mee doen.
  • Heb je misschien een idee hoe ik dit ongeveer aan kan pakken?
    De QSocket class kan het programma iig waarschuwen als er data klaar is om gelezen te worden.
    Volgens mij moet het toch niet zo moeilijk zijn dan, maar ik krijg het maar niet voorelkaar
  • Heb nu dit geprobeerd:

    [code:1:ca28e0ea6f]
    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();
    }
    [/code:1:ca28e0ea6f]
    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!

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.