FD_READ zeigt keine Wirkung



  • hi,

    ich habe einen Socket und rufe WSAAsyncSelect auf, bei welchem ich FD_CONNECT und FD_WRITE angebe. Allerdings bekomme ich keine Nachricht, wenn ich mit send etwas verschicke, auch wenn die daten erfolgreich ankommen. Muss ich da noch etwas einstellen?

    MfG, Herr-Vorragend

    P.S.: für connections bekomm ich komischerweise nachrichten, also die von mir angegebene mit dem wert FD_CONNECT, nur bei FD_WRITE bekomm ich eben nix.



  • lies die documentation.



  • Platform SDK schrieb:

    FD_WRITE: Wants to receive notification of readiness for writing. FD_WRITE Wants to receive notification of readiness for writing.

    d.h. du kriegst ne Nachricht dann, wenn der Socket bereit ist mit send() beschrieben zu werden und nicht wenn send() erfolgreich war 😉



  • hö? das versteh ich jetzt nicht. Also ich schicke mit send "hallo" zum Server-Programm und dieses erhält auch "hallo", dann muss doch auch irgendwann mal FD_WRITE geschickt werden, oder?



  • FD_WRITE:
    When WSAAsyncSelect called, if a send or sendto is possible.
    After connect or accept called, when connection established.
    After send or sendto fail with WSAEWOULDBLOCK, when send or sendto are likely to succeed.
    After bind on a connectionless socket. FD_WRITE may or may not occur at this time (implementation-dependent). In any case, a connectionless socket is always writeable immediately after a bind operation.



  • hm, also seh ich das richtig, dass FD_WRITE nicht immer geschickt wird, je nachdem, wie ich es implementiert hab? das ist aber äußerst schlecht, zumal ich auch kein FD_READ beim empfang von daten erhalte und so nicht weiß, wann die daten nun da sind und wann nicht. (es soll übrigens so ne art chat werden, das heißt mein programm muss daten senden und auch empfangen und bei beidem bekomm ich im moment keine FD_READ bzw. FD_WRITE)



  • du hast doch auch bei WSAAsyncSelect nicht angegeben das du FD_READ willst, oder?

    geh einfach immer davon aus, das du schreiben kannst und schreibe solange bis send mit WSAEWOULDBLOCK fehlschlägt.

    dann bekommst du später ne FD_WRITE nachricht und kannst den rest senden.



  • So, ich habe ein Problem, das direkt zum Thementitel passt:
    Bei mir hat FD_READ anscheinend echt keine Wirkung. Zumindest nicht, wenn ich es in meinem Server-Programm einsetzen will. In einem Client-Programm, das an einen Port gebunden ist, bekomme ich mithilfe von WSAAsyncSelect und FD_READ immer eine Nachricht, wenn es etwas zum Lesen gibt.
    Wenn das Programm aber der "Server" ist, bekomme ich keine solche Meldung. Woran kann das liegen? Ich habe den Server etwa so initialisiert:

    rc=startWinsock();
    s=socket(AF_INET,SOCK_STREAM,0);
    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(12345);
    addr.sin_addr.s_addr=ADDR_ANY;
    rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    rc=listen(s,10);
    WSAAsyncSelect(s, hwnd, WM_SOCKMSG,FD_READ);
    

    Aber WM_SOCKMSG wird eben nicht gesendet, wenn Daten an das Programm gesendet wurden.
    Btw, FD_ACCEPT scheint aber zu funktionieren, ist aber leider nicht das, was ich brauche.



  • Möglicherweise möchtest du einen Socket erstmal mit accept() oder so entgegen nehmen und auf diesen Socket dann WSAAsyncSelect() auf FD_READ checken lassen, statt den listen()-Socket auf FD_READ zu prüfen ?


Anmelden zum Antworten