2016-04-02 9 views
0

Programımda bir soket bağlantısı oluşturuyorum Socket yaptığım bir sınıf kullanarak. Program sonsuz bir döngü içinde çalışır ve çıkmak için ctrl-c'yi kullanırım. Şimdi programı kapattığımda, yok edicim çağrılmıyor (here okunduğumda hafıza serbest bırakılıyor ancak program kesildiğinde soket serbest değil). Böyle bir programdan çıkan yıkıcıyı çağırmanın bir yolu var mı?Program kesintiye uğradığında Destructor çağrısı

soket sınıfı tanımı:

class Socket 
{ 
     private: 
       int m_sock; 
       sockaddr_in m_addr; 
     public: 
       Socket(); 
       virtual ~Socket(); 

       // Server initialization 
       bool create(); 
       bool bind (const int port); 
       bool listen() const; 
       bool accept (Socket&) const; 

       // Client initialization 
       bool connect (const std::string host, const int port); 

       // Data Transimission 
       bool send (const std::string) const; 
       int recv (std::string&) const; 

       void set_non_blocking (const bool); 

       bool is_valid() const { return m_sock != -1; } 
}; 

yoketme tanımı:

Socket::~Socket(){ 
     close(m_sock); 
} 

ana işlevi:

 try { 
       // Create the socket 
       ServerSocket server (15000); 
       std::cout << "Server running on 0.0.0.0:15000" << std::endl; 
       std::string res; 
       while(true) { 
         ServerSocket new_sock; 
         server.accept (new_sock); 
         try { 
           while(true) { 
             std::string data; 
             new_sock >> data; 
             res = process_query(data, kv_map, zset_map); 
             new_sock << res; 
           } 
         } 
        catch(SocketException&) {} 
       } 
     } 
     catch (SocketException& e){ 
       std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; 
     } 
     return 0; 
+0

kodunu görmek için kullanışlı olabilirdi –

+1

soruya bu tür standart cevaptır soket ve sinyal (ctrl-c) tespiti için boost :: asio kullanmak. Bütün komplikasyonları sizin için halleder. –

+0

@RichardHodges Herhangi bir harici kütüphane kullanmıyorum. C++ kullanarak yazıyorum. – ayushgp

cevap

2

Evet, üretilen bir sinyal SIGINT için işleyicisi (sinyalini kurabilirsiniz CTRL-C'yi tıkladığınızda. kullanma C++ standart lib yazabilirsiniz: Sen nasıl fazla bilgi bulabilirsiniz

void close_connection(int signal) 
{ 
    delete socket; // invoke destructor 
    socket.close(); // Alternative, you can add a close method to your socket class 
} 

// Install a signal handler 
std::signal(SIGINT, close_connection); 

burada C++ sinyali yönetmek için http://en.cppreference.com/w/cpp/utility/program/signal

+0

ile gemi yapmayanlardı. Bunu programımda uygulamak için bir yol var mı? İşleyici işlevi imzası, "işleyici (int)" ile eşdeğer olmalıdır. Onu global hale getirmek istemediğim için 'ServerSocket' nesnesini geçmem gerekiyor. – ayushgp

+1

ne hakkında std :: bind'? 2 argüman alan ve SIGINT alındığında serbest bırakmak istediğiniz soket nesnesine bağlayan bir işlev yaratabilirsiniz. Bu şekilde globalden uzak durursunuz. –

İlgili konular