Fehler abfangen bei Casyncsocket



  • Hallo

    über winsock (CasyncSocket) versuche ich einen client an einen Server anzumelden.

    mittels

    Beispielsocket.create();
    

    erstelle ich zuerst den Socket und mit

    Beispielsocket.connect(Server-IP,Port);
    

    stelle ich die Verbindung her.
    Das funktioniert auch einwandfrei.

    Nun möchte ich eine Meldung herausgeben falls die Verbindung nicht klappt

    in der MSDN steht

    Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError.
    

    Daraus folgere ich das ich mit

    if(Beispielsocket.connect(Server-IP,Port)==0)
    

    den Fehler abfragen kann.
    Er gibt aber immer TRUE an diese Abfrage , egal ob die Verbindung klappt oder nicht.

    Wer kann mir da weiterhelfen?

    Gruß und Danke
    Linus



  • Schau dir mal das Bsp im Buch VC++ 6 in 21 Tagen an.

    Da gibt es eine Klasse welche von CAsyncSocket abgeleitet ist.
    Connect kehrt immer sofort zuurück. Es gibt dann eine virtuelle Funktion welche dir den eigentlichen Connect mitteilt.
    Sonst wäre CAsyncSocket ja nicht Async



  • Hi

    Ich habe wie im Buch beschrieben OnConnect überschrieben:

    void CSonchatDlg::OnConnect(void)
    {
         int jSent;
         CString sequenz;
         jSent=m_sConnectSocket.Send(LPCTSTR(sequenz),sequenz.GetLength());
    
         if(jSent==SOCKET_ERROR)
            MessageBox("Fehler","Socket-Fehler",MB_OK);
         else
            MessageBox("OK","Socket OK",MB_OK);
    
    }
    

    bei erflogreicher VErbindung kommt OK
    bei nicht erfolgter Verbindung kommt garnix , keine MessageBox

    andererseits verstehe ich die Aussage nicht
    "Nonzero if succsessful"

    bei mir gibt connect immer 0 zurück, egal ob verbunden oder nicht

    Ich versteh das nicht 😕

    Gruß
    Linus



  • HI

    Mein Fehler !
    Sorry, OnConnet wird natürlich nur bei erfolgreicher Verbindung aufgerufen
    daher kann das so nicht funtionieren. 😃
    Und wegen der Asynchron auch nicht bei MySocket.Connect()
    Werde einfach mit dem Timer fragen ob OnConnect nach einer bestimmten Zeit aufgerufen wurde. Oder hat jemand eine andere Idee ?

    Danke
    Gruß Linus



  • ????

    Wenn OnConnect kommt dann weitermachen.
    Wenn ein Fehler ist kannst du den auch abfragen.
    Da ist nichts mit Timer.

    void CMySocket::OnConnect(int nErrorCode)
    {
    	if (nErrorCode == 0)
    		((COMS_VerwaltungDlg*)m_pWnd)->OnConnect();
    }
    

    CMySocket ist von CAsyncSocket abgeleitet.

    Wenn verbunden dann wird OnConnect() in der Dialogklasse aufgerufen. Mit einer else kann man bei error auch was anderes aufrufen.



  • Hallo

    Das ist ja gerade das Problem

    Ich teste es immer so dass ich eine ip verwende , die nicht vergeben ist ( in meinem Netz)
    Dann kann ja keine VErbindung zustande kommen.

    Dann erhalte ich aber bei m_sConnectSocket.connect(ip,Port) eine 0 (=Fehler) zurück und OnConnect() wird gar nicht aufgerufen ( habe es mit Messagbox kontrolliert)
    m_sConnectSocket.connect(ip,Port) gibt aber auch bei korrekter Verbindung eine 0 zurück , das liegt wohl daran dass die Verbindung asynchron aufgebaut wird (wenn ich das richtig verstanden habe).

    Das gleiche gilt wenn ich im Wlan die Verbindung verliere nachdem die Verbindung zum Server aufgebaut ist bekomme ich auch mit OnReceive() keine
    Fehlermeldung

    wo erkenne ich denn wann ein Verbindungsproblem aufgetreten ist ?

    Danke
    Gruß Linus

    PS ich habe das Programm genauso aufgebaut wie im o.g. Buch (neueste Ausgabe für vc++ .net).


Anmelden zum Antworten