unerklaerlicher doppelter aufruf einer funktion



  • hola leute

    hab mir eine socketklasse fuer einen tcp-server geschrieben.
    fuer benachrichtigungen verschiedenster art hab ich bcb-events hinzugefuegt.
    nun hab ich das problem das meine funktion 'on_close' doppelt aufgerufen wird.
    mal bissl code:

    class Socket
    {
       public:
          Socket(void);
          Socket(const Socket &s);
          virtual ~Socket(void);
    
          SOCKET GetSocket(void) const;
          operator SOCKET(void) const;
          virtual void CloseSocket(void)
          {
             if(socket)
             {
                ::closesocket(socket);
                socket = 0;
             }
          }  
    
       protected:
          SOCKET socket;
    };
    
    template<int family, int socktype, int protocol>
    class ServerSocket : public Socket
    {
       public:
          ServerSocket(void) : port(0) { }
          ServerSocket(const ServerSocket &ss) : Socket(ss), port(ss.port) { }
          virtual ~ServerSocket(void) { }
    
          bool BindSocket(unsigned short t_port);
    
          virtual void CloseSocket(void)
          {
             Socket::CloseSocket();
             port = 0;
          }
    
          bool IsActive(void) const;
          unsigned short GetPort(void) const;
    };
    
    class TcpServer : public ServerSocket<AF_INET, SOCK_STREAM, IPPROTO_TCP>
    {
       public:
          typedef void (__closure *OnListen)(SOCKET socket);
          typedef void (__closure *OnAccept)(SOCKET socket);
          typedef void (__closure *OnClose)(SOCKET socket);
          typedef void (__closure *OnConnected)(TcpServer *server, SOCKET client);
          typedef void (__closure *OnError)(TcpServer *server, const char *str);
          typedef void (__closure *OnStatus)(TcpServer *server, const char *str);
    
          TcpServer(void);
          TcpServer(const TcpServer &ts);
          virtual ~TcpServer(void);
    
          bool Listen(void);
          virtual void CloseSocket(void);
    
          OnListen on_listen;
          OnAccept on_accept;
          OnClose on_close;
          OnConnected on_connected;
          OnError on_error;
          OnStatus on_status;
    };
    
    // cpp-file
    void TcpServer::CloseSocket(void)
    {
       if(on_close)
          on_close(socket);
    
       ServerSocket<AF_INET, SOCK_STREAM, IPPROTO_TCP>::CloseSocket();  //(1)
    }
    

    wenn ich nun CloseSocket aufrufe, wird on_close 2x aufgerufen.
    wenn ich zeile (1) wegtue wird on_close nur noch einmal aufgerufen.
    sieht da jemand den fehler ?

    Meep Meep



  • Hast du mal im Debugger verfolgt, von wo aus die Funktion aufgerufen wird? (Call-Stacks sind da eine durchaus nützliche Erfindung)



  • re
    fehler gefunden. hab an ner anderen stelle anstatt den clientsocket, den server socket nochmal geschlossen.

    Meep Meep


Anmelden zum Antworten