2014-04-29 86 views
0

在服務器應用程序中處理無限循環中的中斷信號的最佳方法是什麼?處理服務器應用程序中的中斷信號的最佳方式?

我開發了簡單的FTP服務器,每個客戶端都有自己的線程。而現在,我想要做的是處理中斷信號,然後中斷客戶端線程向量中的每個線程。 在每個線程中,我都希望有機會在發送/接收某個文件並手動關閉套接字時向客戶端發送一些響應。在主線程中,我只想記錄該服務器被中止並關閉服務器套接字。

我有一個想法實現我的服務器類FTPServer像單身人士,並在signal()調用一個函數調用方法abort()的FTPServer實例。但我不知道當主要的死循環仍在運行時它將會執行什麼操作,並且accept()仍在等待新的客戶端...並且此模式我不能在客戶端線程中使用,因爲不僅有一個實例..

我的方法是:

void FTPServer::run() {  
    while (1){  
      int cliFd = TCPController::acceptClient (m_serverFD); 

      serveNewClient(cliFd); 
     }  
} 
void FTPServer::serveNewClient(int clientFD){  
    m_client_threads.push_back(thread(&FTPServer::clientThread, *this, clientFD)); 
} 

void FTPServer::clientThread(int clientFD){ 
    ClientThread client(clientFD); 
    client.run();  
} 

所以我要處理的中斷信號,斷裂主要無限循環,並呼籲中止()方法(?)。 我正在尋找這樣的事情:

void FTPServer::run() {  
    try{ 
     while (1){  
       int cliFd = TCPController::acceptClient (m_serverFD); 

       serveNewClient(cliFd); 
      }  
    catch(RuntimeException & e){ 
     this.abort() 
    } 
} 

但我沒有發現任何東西.. :(

在每一個客戶端線程我有無限循環太 - 等待客戶端的命令......

所以,能不能請你告訴我,什麼是處理它的最佳方法是什麼? 謝謝!

回答

0

你有多個線程,每個都有自己的循環。你應該做的是確保你的線環經常檢查如果他們應該被中止。因此,不要無限期地在acceptClient上進行阻止,請接受超時連接。當超時到期或連接被接受時,檢查線程是否應該退出。

相關問題