OnReceive ??? CSockets und die unergründlichen Weiten des Netzes....
-
Aloha,
ich bin sehr frisch, was das Netzwerkprogrammieren angeht.
Ich habe eine Server/Client Anwendung, die fürs WAN und/oder LAN konzipiert is.
Nun will ich Daten aus einer auf dem Server lagernden DB abfragen und verwerten im Client ( was auch sonst ??? ).
Ich habe ne Funktion names
fill_statics() { SendServerMessage("GibmirendlichDaten"); m_statics1.SetWindowText(data1); m_statics2.SetWindowText(data2); .... }
Wie ihr seht, sende ich dem Server eine Nachricht, er möge mir Daten senden, und gleich danach will ich diese empfangenen Daten ausgeben.
Daraus resultiert meine Frage.
Wie mache ich der Funktion klar, bitte auf die Serverantwort zu warten, sodaß ich die frischen und aktuellen Daten in dem Rest der Funktion verarbeiten kann ?
Oder muß ich das stylistisch komplett anders angehen und somit umdenken ???
Beste Grüße
BOA
-
CSockets sind nicht asyncron. SOmit wartet der Code immer
-
Aloha,
wow, wow, wow, langsam....
erstmal danke für die Antwort.
Abgesehen davon, daß mir nicht genau klar ist, wat denn nu in diesem speziellen Falle asynchron, bzw. synchron für Auswirkungen hat, ist doch CSocket von CAsyncSocket abgeleitet, sind sie damit nicht asynchron ???
Ich denke, da muß ich halt noch mal googlen, um mir ein paar Basics einzupfeifen.Ich habe jetzt mal folgendes gemacht, was im LAN auch funzt.
SendServerMessage("Gib Mir Daten"); int buffer; Socket.receive(&buffer,4); ......
und siehe da, ick bekomm meene Daten in den Buffer.
Ok, damit habe ich natürlich nicht den Nobelpreis verdient, aber mir stellt sich nun die Frage, was passiert, wenn der Server mal wirklich Probleme hat, oder einfach T-Offline auf der Leitung steht, so daß es ein paar Sekunden dauert, bis irgendetwas über die Leitung ankömmt.Da ist mein Code doch schon meilenweit vorbei am Receive() ( weil ich hab doch ultra-schnell Rechner, Alder...
)
Wie kann ich der Funktion sagen, warte, warte, warte, bis die Daten da sind, bzw. brich das Daten Holen ab nach 2 Minuten, kommt eh nichts mehr...
Vielleicht so ?
SendServerMessage("JibDaten, Alder"); int daten; while(0) { if(Socket.Receive(&daten,4) != 0) break; }
Das mit der Zeit krieg ich auch hin, so daß das ding nicht unendlich lüppt....
Grüße
BOA
-
CSocket ist nicht von CasyncSocket abgeleitet sondern umgekehrt. Bei CasyncSocket sind auch noch thread drin sonst wäre es ja nicht async.
Du kannst aber async arbeiten und beim rec. dann eine entsprechende funktion starten. Ist IMHO schwieriger aber schöner als wenn du die GUI blockierst
-
Aloha,
ähh, ich will ja nicht über Kleinigkeiten streiten, aber CSocket ist von CAsyncSocket abgeleitet, es sei denn, Du hast Deine eigene MFC geschrieben...
Das, was Du mit der Funktion beschreibst, die ich im Receive starten soll, habe ich gemacht.
Und das ist einfach mal blöd, das wird unübersichtlich mit der Zeit.Und jetzt wird auch keine GUI blockiert, da es ja async ist....
Danke Dir trotzdem, hast mir diverse Denkanstöße gegeben.
Grüße
BOA
-
Hast natürlich recht. Da CSocket blockierend ist und nicht async dachte ich nicht das es von CasyncSocket kommt.
-
CSocket ist ein scheiß Teil. Les dir das mal durch: