2007年1月24日 星期三

socket socket socket

最近的網路作業要寫一個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 才是王道!改天應該要來研究一下

沒有留言: