Vraag & Antwoord

Programmeren

Netwerk design vraagje

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

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

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