2015-12-16 100 views
0

C信號(sigpipe,sighup)我必須處理SIGHUP和SIGPIPE信號,以避免通過Socket TCP連接的客戶端關閉終端(GUI的[X])不符合' t關閉或崩潰SERVER。通過Socket

我在客戶端上設置一個sigup處理這樣

void sighup() 
{ 
    signal(SIGHUP, SIG_IGN); 
    system("echo SIGHUP received>>log.txt"); 
    close(socket); 
    exit(0); 
} 

在服務器上我給自己定一個SIGPIPE處理這樣

signal(SIGPIPE,SIG_IGN); 

但是,如果客戶端關閉窗口的終端,服務器循環。

有什麼想法? 謝謝你的好意支持

+1

循環爲什麼/如何?您在這裏沒有提供足夠的信息。我不得不猜測,一旦套接字被拋棄,在套接字上進行的讀或寫調用總是立即返回,因爲現在讀/寫錯誤。您需要檢測並丟棄套接字或採取適當的措施......如果發生了什麼...... – Michael

+0

如果您忽略SIGPIPE,寫入操作將返回一個錯誤,將'errno'設置爲'EINTR'。只要您持續謹慎地測試您的寫入操作是否成功(並在不成功時採取適當的操作 - 這意味着停止嘗試寫入),這很有用。否則,這是一場災難。 –

+0

我犯了一個錯誤,我將把所有的檢查全部寫入並讀取錯誤。但是,無論如何,這是處理這種情況的正確方法嗎? 客戶端關閉終端 服務器需要繼續 您有任何想法建議我嗎? 謝謝 –

回答

0

我做了一個錯誤,我會把所有檢查所有的寫入和讀取 istructions與PERROR。但是,無論如何,這是正確的方式來處理 的情況?

忽略SIGPIPE是可行的。或者,您可以通過將MSG_NOSIGNAL標誌設置爲send()來防止生成SIGPIPE。