最近的網路作業要寫一個Instant Messaging Server
其中令人頭大的一點,就是要做容錯處理
當Client 連上來立即斷線,或呆呆的啥都不幹時
Server 要把它們踹開,服務其它嗷嗷待哺的Clients
經過詢問Guru 後
決定三種解法
將socket 讀取變成 Non-blocking mode (via fcntl)
int flags = fcntl(*new_con, F_GETFL, 0);
fcntl(*new_con, F_SETFL, flagsO_NONBLOCK);
再搭配計時器
設定socket 的recieve timeout
setsockopt(servSockFD,SOL_SOCKET,SO_RCVTIMEO,&timeval,sizeof(timeoutVal));
動都不動... =口=
經過Guru開釋,發現以下資訊
SO_RCVTIMEO and SO_SNDTIMEO
Specify the sending or receiving timeouts until reporting an
error. They are fixed to a protocol specific setting in Linux
and cannot be read or written. Their functionality can be emu-
lated using alarm(2) or setitimer(2).
總之就是咧 linux 不給改socket 的 SO_RCVTIMEO, 建議自已用select 做polling...當下決定棄城而逃
Blocking mode 的讀取配合另開thread 的計時器
OK, 這純粹是因為Blocking mode效能優於Non-blocking mode, 所以只是想想,倒沒有真的實作。
最後尾巴是理所當然、偷懶的用了第一種解法,不過怎麼看 select + polling 才是王道!改天應該要來研究一下
沒有留言:
張貼留言