[問題] socket程式的SIGPIPE問題
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是否已經壞掉了
求助各為了 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.127.111
→
09/10 18:07, , 1F
09/10 18:07, 1F
推
09/10 20:31, , 2F
09/10 20:31, 2F
→
09/10 20:32, , 3F
09/10 20:32, 3F
→
09/10 20:34, , 4F
09/10 20:34, 4F
→
09/10 20:35, , 5F
09/10 20:35, 5F
→
09/10 20:48, , 6F
09/10 20:48, 6F
→
09/10 20:58, , 7F
09/10 20:58, 7F
→
09/10 20:58, , 8F
09/10 20:58, 8F
→
09/10 23:08, , 9F
09/10 23:08, 9F
→
09/10 23:11, , 10F
09/10 23:11, 10F
→
09/10 23:11, , 11F
09/10 23:11, 11F
→
09/10 23:13, , 12F
09/10 23:13, 12F
→
09/10 23:14, , 13F
09/10 23:14, 13F
→
09/10 23:14, , 14F
09/10 23:14, 14F
→
09/11 14:07, , 15F
09/11 14:07, 15F
→
09/11 14:07, , 16F
09/11 14:07, 16F
→
09/11 14:08, , 17F
09/11 14:08, 17F
→
09/11 14:09, , 18F
09/11 14:09, 18F
→
09/11 14:09, , 19F
09/11 14:09, 19F
→
09/11 15:57, , 20F
09/11 15:57, 20F
→
09/12 16:26, , 21F
09/12 16:26, 21F