inet:getstat/2的用處
在遊戲開發中,client和server之間需要維護一個心跳 ,用來檢測client的網絡異常中斷(如突然拔掉網線),進而進行一些清理,保存工作.嚴謹的服務端,除了確保客戶端提交的各種請求都合法,此外還需要限制玩家發包速度 ,用來踢掉一些惡意的客戶端(如移動加速,攻擊重複發包等). 這兩個小功能,在Erlang遊戲服務器開發中,通過inet:getstat/2可以很容易實現.
首先看看其說明(kernel/inet):
getstat(Socket) getstat(Socket, Options) -> {ok, OptionValues} | {error, posix()}
獲取socket的一個或多個統計信息.
getstat(Socket)等同於getstat(Socket, [recv_avg, recv_cnt, recv_dvi, recv_max, recv_oct, send_avg, send_cnt, send_dvi, send_max, send_oct])(注意在R14B02中這裏有一個筆誤,send_dvi應該爲send_pend).
選項說明:
- recv_avg
- recv_cnt
- recv_dvi
- recv_max
- recv_oct
- send_avg
- send_cnt
- send_pend
- send_max
- send_oct
通過間隔的判斷recv_cnt,我們可以得知client是否還在"活動",我們不需要處理專門的"心跳"數據包.通過socket的統計信息便可.
通過定期(或隨機)的檢測recv_cnt, recv_oct,我們可以得知某個client,是否在一段時間內頻繁發送數據,是否發送了大量的數據,
從而做一些應對.
下面是在Erlang shell中的調用舉例:
> inet:getstat(Socket). {ok,[{recv_oct,38832}, {recv_cnt,106}, {recv_max,1460}, {recv_avg,366}, {recv_dvi,33}, {send_oct,9896}, {send_cnt,104}, {send_max,574}, {send_avg,95}, {send_pend,0}]} > inet:getstat(Socket,[recv_cnt, recv_oct]). {ok,[{recv_cnt,114},{recv_oct,41175}]}
注意:inet:getstat/2的返回值,不要匹配錯誤 :)