hi
請問各位
我的程式會不斷的發送資料給client端
使用的是TCP/IP連線
但是我實驗發現 如果client端未依正常程序結束(例如跳電,拔網路線)...等
server端大約過5~6秒就會卡住
所有資料都送不出去了 這時唯有結束server端程式重啟才行
查了一下google 有提到SIGPIPE 說是在send的過程中如果client端斷線或是RST
這時候系統會拋出一個SIGPIPE的signal
預設的處理方式是結束terminal 這當然不是我想要的
然後有說可以用
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );
用signal的函式讓SIGPIPE交給SIG_IGN處理
然後有提到sigaction函式是使用一次就永久有效
如果用signal(SIGPIPE, SIG_IGN); 則是只有一次效果
但是經過我交叉測試 不管我怎麼設 只要我手動把client端網路關掉
大約經過5~6秒後 server端就一定會卡住 動彈不得
新資料送不出去 client連線也連不進來
請問我該怎麼處理比較好呢
理想狀態是如果SIGPIPE 我就把那個connection close掉
至少server端系統要持續進行 不能終止或是卡住
只是要先偵測到SIGPIPE 因為靠send函式的return值無法觀察出這個connection是否已經壞掉了
求助各為了 謝謝
--
All Comments