2012-06-07 30 views
2

我正在寫一個TCP服務器。 它所要做的一切就是從TCP套接字讀取/寫入文本,並將該文本讀寫到運行服務器的文件系統上的文本文件。什麼信號最好在TCP服務器中處理?

如果連接有問題(例如,客戶端關閉套接字),則在讀取/寫入時阻塞的服務器會收到SIGPIPE信號。我想忽略它:服務器只是關閉它的套接字的結束,因爲現在通信是不可能的。 這是一個好方法嗎?

我還有其他信號需要考慮嗎?

回答

4

許多服務器程序選擇忽略SIGPIPE,並使用read/write的返回碼更好地瞭解斷開連接。例如,read/recv返回0與另一端正確斷開連接,並且-1出錯,errno設置爲多個備選項之一。

+0

'sendto' /'sendmsg'可以帶一個標誌來避免產生'SIGPIPE',這也是一個不錯的選擇。我從來不想在我的網絡代碼和我的信號處理代碼(如果有的話)之間產生醜陋的依賴關係,所以我總是使用這種方法或者在發送代碼周圍阻塞SIGPIPE,並在解除阻塞之前刪除和可能未決的SIGPIPE。這避免了改變或取決於調用代碼的全局狀態(信號處置)。 –

1

你也可以實現一箇中斷處理程序,以防服務器崩潰,你可能想在關閉之前做一些操作。

例如SIGINT

void interrupt_handler(int sig){ 
    endloop = 1; 
    close(sd); 
    printf("Interrupt recieved: shutting down server!\n"); 
    return; 
} 

int main(int argc, char** argv){ 

    //all typical TCP socket functions 

    signal(SIGINT, interrupt_handler); 

    while(!endloop){ 

     //service loop 

    } 

} 
0

如果服務器是一個守護進程,這是一個普遍的做法是使用SIGHUP重新啓動或重新初始化服務器。 @ Joachim的答案是最重要的,但是:客戶端行爲不應該導致服務器終止。

注:作爲異步,有​​什麼信號處理能做到的,安全的。

+0

這將是很好的闡述最後一點,並注意,除非你是信號處理規則的專家,否則最好不要在信號處理程序中做任何事情,而是通知主程序流程它需要在下一個機會中行動(例如使用自我管理)。 –

相關問題