Ga naar inhoud

Netwerk design vraagje


anoniem

Aanbevolen berichten

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
Link naar reactie
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.
Link naar reactie
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!
Link naar reactie
1) Ik ken de Qt API niet 2) Bij non-blocking zul je de return-code van een connect in de gaten moeten houden; met de gewone C-library zou je een melding krijgen dat de actie (het connecten) al bezig is (EINPROGRESS meen ik). [code:1:5db12dd4fb] while(1) { rc=connect(....); switch(rc) { case ....: // doe iets return rc ; break; case ....: // doe iets return rc; break; case EINPROGRESS: // nog bezig break; default: // OK return rc; } }[/code:1:5db12dd4fb] 3) Ik gebruik select om te kijken of er iets gebeurt op de sockets. Is verder prima te gebuiken in combinatie met keyboard input (simpel filedescriptor 0 toevoegen), dus zijn threads niet echt nodig in mijn ogen. Kan een ander verhaal zijn om mouse-input af te vangen, ik houdt me niet zo bezig met GUIs. Hoop dat je er wat aan hebt.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...