inet:getstat/2小用法

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
socket收到數據包的平均大小(字節) 
  • recv_cnt
socket收到的數據包總數
  • recv_dvi
socket受到數據包的平均大小偏差
  • recv_max
socket收到的最大數據包(字節)
  • recv_oct
socket收到的總字節數
  • send_avg
socket發送數據包的平均大小(節數)
  • send_cnt
socket發送的數據包總數
  • send_pend
socket中待發送數據大小(字節)
  • send_max
socket發送的最大數據包(字節)
  • send_oct
socket發送的總字節數

通過間隔的判斷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的返回值,不要匹配錯誤 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章