Frage zur Verwedung von Sockets



  • Hallo Community,

    ich habe mir eine Netzwerkklasse geschrieben in welcher ich mich über TCP/IP mit einem Socket verbinde.

    Das Verbinden/Trennen sowie Daten senden und empfangen funktioniert auch einwandfrei.

    Meine Frage ist nun, wie bekomme ich mit das auf dem Socket neue Daten angekommen sind, welche ich dann mit der "recv" auslesen kann??

    Gibt es in Windows ein Event das ich nutzen kann?

    Bin über Google auch schon auf Diverse Dinge wie die "WSAEvent..." gestoßen. Kann ich darüber evtl. mitbekommen ob Daten am Socket anliegen ?? Wenn ja wie Connecte ich meine Klasse so, das meine OnEventNewDatas(..) Funktion aufgerufen wird wenn neue Daten anliegen..!?

    Mfg
    Ollow



  • Mit select() geht es plattformunabhägig. 😉



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Man braucht zwei verschiedene Sockets wenn man Daten empfangen und senden will einen fürs senden und (genau genommen zwei) fürs empfangen.
    Wenn man dann gleichzeitig empfangen und senden will, muss man einen zusätzlichen Thread (z.B. fürs empfangen) erstellen. recv blockiert dann diesen Thread solange, bis Daten empfangen werden können.



  • Ollow_AM schrieb:

    Meine Frage ist nun, wie bekomme ich mit das auf dem Socket neue Daten angekommen sind, welche ich dann mit der "recv" auslesen kann?

    Entweder - wie schon geschrieben wurde - mit select(), oder einfach recv aufrufen. Auf einem blockierenden Socket kehrt die Funktion allerdings nicht zurück, wenn keine Daten zu lesen sind. Wenn das nicht gewünscht ist, einen nicht blockierenden Socket verwenden. Wenn auf dem nicht blockierenden Socket auch gesendet werden soll, muss berücksichtigt werden, dass ein send auf einem nicht blockierenden Socket nicht garantiert die gesamte zu sendende Datenmenge verschickt, es muss also dann durch eine Schleife sichergestellt werden, dass alle Daten gesendet werden, wie das beim Empfangen mit recv sowieso erforderlich ist.


Log in to reply