winsock2 non-blocking



  • hi leutz!
    also, ich hab nen dickes problem. und zwar schreib ich grad nen programm das sich daten aus dem netz saugt. ich programmier nur den client, der server existiert schon. so...

    wenn mein programm startet, dann verbindet der sich mit dem server, und dann schickt er ersma ne menge daten an den server. sollte er zumindest. das problem ist das das nur manchmal klappt, meistens bekomme ich die fehler-meldung WSAEWOULDBLOCK.

    so... hab nen bisschen gegoogelt, und rausgefunden das ich meine socket auf non-blocking, bzw asynchron umschalten kann. aber irgendwie kriege ich das nich hin, bzw das funzt nich bei mir. kann mir das jemand helfen?

    hab die winsock in eine klasse geschachtelt, in der ich die funtion connect, send, disconnet und reconnect hab...

    hoffe ihr könnt mir helfen!!!

    thx in advance,
    yours arnold72



  • Du solltest Dir mal WSAEventSelect und WSAWaitForMultipleEvents und WSAEnumNetworkEvents anschauen...
    Hierzu sollte es auch genügend Beispiele auf Codeproject oder Codeguru geben...

    WSAEnumNetworkEvents: http://msdn.microsoft.com/library/en-us/winsock/winsock/wsaenumnetworkevents_2.asp



  • hatte das schon auf asynchron umgestellt, hatte aber dann das problem das der nach send() 0 zurückgab, worauf ich reconnecten wollte, das aber nur invalid_socket zurückgeliefert hat...



  • Wenn Du es auf asynchron umstellst, dann ist es normal dass es manchmal WSA_WOULDBLOCK zurückliefert!!! Wenn Du dies nicht willst, dann darfst Du es nicht auf asynchron (non-blocking) stellen! Dann musst Du es auch "blocking" lassen!
    Was ist denn jetzt Dein Problem? Aus meiner Sicht hast Du keines, da es ein normales Verhalten ist.



  • mein problem ist das das prog nicht die ganzen daten wegschickt die es normalerweise wegschicken sollte....

    das sind so um den dreh 60kb...

    irgendwann blockt der, und dann gibt der halt immer 0 zurück...
    heisst das denn dann das der die daten auch sendet wenn der 0 zurück gibt?
    ( also wenn ich auf asy hab )

    bzw, wenn der einmal wsa_wouldblock gesagt hat, das man das irgendwie wieder zurückstellen kann, so das der dann nach send auch sagt was raus gegangen ist?



  • arnold72 schrieb:

    mein problem ist das das prog nicht die ganzen daten wegschickt die es normalerweise wegschicken sollte....

    das sind so um den dreh 60kb...

    irgendwann blockt der, und dann gibt der halt immer 0 zurück...

    Das bedeutet eigentlich nur, dass der Server gerade beschäftigt ist und gerade keine Daten annehmen kann.
    Wenn "send" WSAEWOULDBLOCK zurückliefert und Du hast einen Event auf "FD_WRITE" gesetzt (WSAEventSelect), dann musst Du eigentlich nur auf das Event warten und wenn FD_WRITE signalisiert wird, kannst Du wieder weitersenden.



  • so hab ichs ja auch gemacht. nur dann hat der nach send immer 0 zurückgeliefert. und das heißt ja das der nix geschickt hat...

    muss ich da irgendwie noch reconnecten oder so was? oder schickt der die daten trotzdem weg, und liefert nur 0 zurück weil die vielleicht noch im buffer sind, oder wat?



  • Wenn der 0 zurückliefert heisst das eigentlich immer dass Du "WSAGetLastError" aufrufen musst und nach dem Error-Code schauen musst.
    Wenn er WSAWOULDBLOCK ist, dann mach bitte das was ich weiter oben beschrieben habe (ja, Du musst das letzte Paket nochmals senden).
    Wenn er was anderes zurückliefert, dann poste bitte mal den Fehlercode...



  • argh man lies doch bitte was die MSDN dazu zu sagen hat. Es wurde doch auch schon 100 mal gesagt was du machen musst wenn WSAWOULDBLOCK zurückgegeben wird. Du kannst auch blocking sockets nehmen und eigene threads benutzen aber lies doch einfach mal in der MSDN da gibts zum thema sockets ziemlich viel und ganz gut erklärt.


Anmelden zum Antworten