2010-05-11 430 views
2

我正在考慮基於服務器和各種客戶端的應用程序,但我遇到了發送命令的問題。 每當我做ctrl + c在客戶端的發送操作殺死線程和進程正在運行(爲了讓多個客戶端我設置一個線程到哪一個)。發送套接字c ctrl + c行爲

如果客戶端(做關閉套接字)正確的服務器不會死,但是當我使用CTRL +ç組合在客戶端上都退出。

我該怎麼做才能防止發送突擊隊發生這種行爲?

Thx提前

回答

2

結帳beej's guide to signals。您需要捕捉並處理信號:CTRL + C,這是SIGINT(終端中斷信號)。

+0

完成thx很多的建議 – 2010-05-11 16:11:51

1

爲了關閉套接字連接和正確的CTRL終止您的客戶端程序 - Ç,您可能需要爲SIGINT提供適當的信號處理程序。這通過使用signal()或優選地,sigaction()功能來完成。

這個問題和它的答案可能會感興趣:How should I close a socket in a signal handler?

在您的服務器程序,你應該檢查每個函數錯誤通過檢查函數的返回值,例如accept()recv()/read()涉及插座。如果函數的返回值指示錯誤(通常爲-1),請查看errnoerrno的值應該提供關於錯誤性質的一些指示,並允許錯誤情況得到適當的處理。這應該有助於您更好地處理客戶端應用程序意外終止時連接丟失的情況。

2

讓我來總結一下,我相信你的問題是:當你打CTRL +Ç關閉客戶端,在服務器退出。並且希望以這種方式處理此行爲,以便服務器不會像上面那樣崩潰。如果這是真的,那麼請仔細閱讀,我想我可能會對實際問題有所瞭解,但與使用(或不使用)適當的信號處理並無太大關係。

當您關閉使用CTRL +ç客戶端,操作系統將停止客戶端程序,並通過關閉它打開的所有插座。作爲其中的一部分,FIN將被髮送到服務器。

請檢查您的代碼。我相信你會以這樣的方式編寫代碼,它會在與客戶端相關的套接字的read()調用中被阻塞。現在,當上面發送的FIN到達服務器端套接字時,此讀取將返回值爲0.

如果您的代碼不檢查此情況並嘗試將某些內容寫回客戶端,最終(我跳過幾步發生在中間),它會收到一個SIGPIPE。這會導致你的服務器崩潰。

如果上述情況屬實,則有兩種方式: 1.檢查read()返回0並正常繼續。 2.安裝SIGPIPE的信號處理程序。

我更喜歡第一種方法,順便說一句。