socket überprüfung



  • Hi, will eine bereits bestehende verbindung überprüfen lassen, ob sie immernoch besteht...wie geht daS ? also man könnte natürliuch nochmal int connect() aufrufen, aber das wäre ja ein reconnect und keine verbindngsüberprüfung...also wie stelle ich das an ?

    mfg



  • schau die mal die methode select an



  • will eine bereits bestehende verbindung überprüfen lassen, ob sie immernoch besteht

    Das geht nicht.



  • hab mich vlt etwas doof ausgedrückt
    wenn ich auf der einen seite den socekt beende...dann müsste man auf dem adneren pc
    erst mal die verbindung aktuallisuieren...um festzustellen , dass es keine mehr gibt.. vlt geht das ja auch anderes...könnte man evt bevor man die verbindung beendet noch ein befehl an den andern pc senden oder ähn. ?

    mfg



  • wenn du ihm sagt das du ein aktives close ausführst, führt die andere seite ein passives clos aus. so stehts in meinem buch..
    frag mich nicht wie man das macht, aber wenn dus weißt sagt mal wie 😉

    EDIT:
    Hat wohl was mit der Socketoption: SO_LINGER zu tun..



  • ...... schrieb:

    will eine bereits bestehende verbindung überprüfen lassen, ob sie immernoch besteht

    Das geht nicht.

    Dein glück das du deinen namen nicht benutzt hast....

    mache zuerst ein select, wird die verbindung normal beendet gibt select 1 zurück und dein lokaler socket wird in dem read-set gesetzt, lesen tust du eine 0, was bedeutet closesocket() wurde ausgeführt, desweiteren kann bei unnatürlichen abbrüchen dein socket im error-set landen bei select was dann auch wieder 1 zurückliefert, was ist so schwer btw. falsch daran ?

    http://msdn2.microsoft.com/en-us/library/ms737582.aspx
    weit unten ist ausführlich beschrieben was bei SO_LINGER passiert!



  • ahja.. an select hat ich dabei ja noch gar nicht gedacht...

    aber wenn jetzt zb ein netzwerkkabel entfernt wird, wie schnell bekommt select den socket error?



  • entweder kommt select mitm error oder recv kommt mitm error, in beiden fällen kommt es schnell genug .... in msec kann ich das jetzt nicht genau sagen, aber ich arbeite im moment selber mit sockets sehr intensiv, und kann dir sagen das es kein problem darstellt, wenn du überall dein if (recv() == 0) GetLastError(); hinkritzelst ^^

    while(select(NULL,read_set,NULL,error_set,timeout_val)){
        if (ISSET(Socket1, read_set)){
            int received = recv(socket...);
            if (received < 0){
                OutputDebugString(IntToStr(WSAGetLastError()).c_str());
            }
            else if (received == 0){
                OutputDebugString("Socket wurde geschlossen");
            }
        }
        else if (ISSET(Socket1, error_set)){
            OutputDebugString("Socketfehler");
        }
    }
    

    zu dem write_set was man noch benutzen kann, damit prüfst du ob der socket schreibbereit ist, wenn ich mich nicht irre müsste der select immer sofort größer 0 zurückliefern, wenn der Socket OK ist, wenn dein select auf write_set mal 0 liefert, btw. einer deiner sockets false bei ISSET(Socket, wite_set) liefert, dann ist seine sendeschlange voll, weil der client kein recv ausgeführt hat!

    beachte das unbedingt beim send() , sonst rennst du mit deinem server unerverhofft in einen deadlock, wenn einer der clients irgendwo n hänger hat und kein recv mehr ausführt, der socket aber noch immer offen ist.

    also praktisch immer

    if (select(NULL,NULL,write_set,NULL,timeout)) {
        send();
    }
    else {
        OutputDebugString("Fehler, warteschlange voll!");
    }
    

    PS: Sorry for BCB Code, bin verdammt mit Borland zu arbeiten, falls das hier jemanden das auffält XD



  • das ist ja echt ne feine lösung!
    schitt nun muss ich mein programm ja wieder komplett ändern 😉


Anmelden zum Antworten