asynchrone Sockets



  • Ich will eine kleines Chatprogramm zu testzwecken erstellen.
    Eigentlich ist es schon fertig, treibt aber die Systemauslastung auf 100%,
    weil ich einen Thread erstellt hab mit einer recv()-Endlosschleife.
    Die Alternative sollten asynchrone Sockets sein, aber dazu finde ich keine
    Tutorials.
    Hat zufällig jemand den Code eines kleinen Chatprogramms auf der Basis der
    asynchronen Sockets?



  • Das die CPU-Auslastung auf 100% geht dürfte nicht sein.
    Die einzige Möglichkeit die mir dazu einfällt ist dass
    du None-Blocking-Sockets verwentetst.
    Wenn ja dann musst du ein Sleep einfügen wenn du nichts empfängst:

    while(1)
       {
       i=resv(...);[b]
       if(i<=0)
           {             
           Sleep(50);           
           }
       [/b]
       ...
       }
    

    Meine Webseite:

    http://members.inode.at/anton.zechner/az/index.html



  • Woran erkenn ich denn, dass ich das nicht blockende recv() benutze?



  • Wenn du mit dem Socket vorher WSAAsyncSelect() aufgerufen hast oder es mittels ioctlsocket() in den non-blocking modus gesetzt hast.

    Außerdem wirst du dann vermutlich hin- und wieder mal SOCKET_ERROR mit WSAEWOULDBLOCK von recv() zurückbekommen.
    Im blocking-mode wartet recv() solange bis Daten verfügbar sind - Die CPU-Auslastung geht dabei allerdings NICHT auf 100% 😉
    Falls dein Socket im blocking-mode ist, vermute ich den Fehler daher woanders...


Anmelden zum Antworten