recv (Socket)



  • Zu erst mal sry, falls es das falsche Forum ist (und C besser wäre oder was weiß ich ne ^^)...
    Also ich habe einen Thread, der wartet auf nen recv - soll aber extra noch auf (mehrere andere) Events reagieren - das möglichst effektiv und zeitnah ^^
    aber wie bekomm ich nen handle auf das recv-event oder wie auch immer?

    Danke : >



  • Hallo,
    welches BS?



  • Du musst asynchrones IO verwenden.
    Dazu brauchst du einen sog. "demultiplexer" der mit deinen Events umgehen kann, z.B. select (gibts (fast?) überall wo's auch Sockets gibt). Der "demultiplexer" ist zuständig dafür dass du in einem Thread auf mehrere (evtl. verschiedenartige) Events warten kannst.

    Je nach OS stehen aber auch andere (mächtigere) Alternativen zur Verfügung. Unter Windows kannst du z.B. IO Completion Ports verwenden, oder auch WSAEventSelect + WaitForMultipleObjects oder WSAAsyncSelect + GetMessage.

    Achja: polling könnte man auch noch als demultiplexing-mechanismus aufführen, ist aber meist nicht sehr effizient, und die "Reaktionszeit" ist relativ mies.

    WSAEventSelect wird AFAIK nicht allzu oft verwendet (fällt mir jetzt zumindest kein Beispiel ein), WSAAsyncSelect wird hauptsächlich in GUI Applikationen verwendet (MFC CASyncSocket verwendet AFAIK WSAAsyncSelect), und IO Completion Ports werden gerne (aber nicht nur) für Server-Applikationen verwendet.

    Mit Linux/OS-X & kenne ich mich in Verbindung mit Sockets garnicht aus, also kann ich nicht sagen was es da noch alles gibt.

    ----

    Oder du könntest eine Library wie ASIO verwenden die dir den umständlichsten Teil abnimmt und noch dazu cross plattform ist.



  • Danke : >

    Hab es jz so und es scheint auch ganz gut zu funzen : >

    WSAEVENT NEvent[2];
    NEvent[0] = WSACreateEvent();
    WSAEventSelect(DATA->sock, NEvent, FD_READ); //DATA->sock == socket
    NEvent[1] = CreateEvent (NULL, false, false, NULL);
    SetEvent (NEvent[1]);
    WSAWaitForMultipleEvents (2, NEvent, false, WSA_INFINITE, false);
    


  • Hey,

    ich finde, ein guter Code sollte immer kompatibel sein. Ich bin Linuxer und ich habe einmal einen HTTP-Client geschrieben, der von einem Client erbt. Mit ftp sollte es so ähnlich gehen. Soweit ich weiß, ist der sogar relativ win-kompatibel.

    http://intelcentino.in.funpic.de/ODF_members/king_lo/libodf.tar.gz (im Ordner "network")

    Check it out 😉 👍

    Gruß,
    Johannes



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ 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.


Anmelden zum Antworten