`
litaocheng
  • 浏览: 333168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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的返回值,不要匹配错误 :)

分享到:
评论
6 楼 zj_lin1984 2011-11-04  
litaocheng 写道
erlang_st 写道
Erlang中直接写游戏逻辑太不方便了,希望能出现一篇如何外接其他语言写逻辑的帖子。

习惯了就好,erlang写逻辑也非常顺手泥。

是不是该有业务层的概念呢?
5 楼 litaocheng 2011-10-25  
erlang_st 写道
Erlang中直接写游戏逻辑太不方便了,希望能出现一篇如何外接其他语言写逻辑的帖子。

习惯了就好,erlang写逻辑也非常顺手泥。
4 楼 zj_lin1984 2011-09-30  
受教。
这个对于预防客户端断开是个相当好的方法。
有一种情况:
因为长时间没有数据包,所以网关会断开连接,这个情况估计还是要心跳吧?
3 楼 erlang_st 2011-05-30  
Erlang中直接写游戏逻辑太不方便了,希望能出现一篇如何外接其他语言写逻辑的帖子。
2 楼 litaocheng 2011-04-27  
ronalfei 写道
是说.getstat如果返回{error,_}就表示这个连接已经中断了?如果有具体的返回值,可以做个分析,用来判断是否用外挂的?

我一直想学习一些用erlang来做游戏服务端的技术与技巧,最近老大你的两篇文章很受用啊,支持 一下!~

恩,会有各种返回值,具体的可以参考kernel/inet文档的 POSIX Error Codes 部分.
可以用来判断外挂,以后会抽时间多写些blog
1 楼 ronalfei 2011-04-27  
是说.getstat如果返回{error,_}就表示这个连接已经中断了?如果有具体的返回值,可以做个分析,用来判断是否用外挂的?

我一直想学习一些用erlang来做游戏服务端的技术与技巧,最近老大你的两篇文章很受用啊,支持 一下!~

相关推荐

    跨平台服务器开发组件iNet.zip

    iNet 是跨平台服务器开发组件,包括:网络库、消息队列、定时器、RPC、协程库。 地址:https://github.com/IronsDu/accumulation-dev 请参阅测试代码:examples。 特点:跨平台,效率非常高,安全,可复用,...

    InetIp互联网IP发布工具

    使用方法: 免安装 只需要设置用户名即可 1 打开 user.reg 文件 将下行所示的 sdkd2006 改为你在 http://windy5157.mfa.cc 网站上注册的用户 "User"="sdkd2006" 2 保存修改后的 user.reg 文件 3 运行 ...

    rtl8188eu_r16m_20161208_服务器再次验证最终完成版本_20170531_1559没有外层目录.7z

    全志R16平台的android6.0.1系统下的RTL8188EU的配置V1.0 2017/5/31 10:30 1、R:\wyb\rtl8188eu_r16m_20161208\android\device\softwinner\astar-evb30\overlay\frameworks\base\core\...注: 某些输入文件使用或覆盖...

    INET 3.6.2

    OMNet++官网 https://www.omnetpp.org/ INET Framework组件下载页:https://inet.omnetpp.org/Download.html 下载资源很难下载,所以在这里分享下INET 3.6.2组件

    RTSPServer_HI3516 测试完成

    源代码是CSDN上一位前辈的,我只做了代码整理和优化,测试...2.udpfd = socket(AF_INET,SOCK_DGRAM,0);//UDP 3.SAMPLE_COMM_VENC_Sentjin(&stStream); 不想下代码的话可以先去这里看看http://www.caterwang.com/?id=23

    GIFImage22

    This is a version of Anders Melander's TGIFImage ported to Delphi 7. It supports animated GIF files in Delphi 7...web: http://home20.inet.tele.dk/tolderlund/delphi/ web: http://finn.mobilixnet.dk/delphi/

    inet-2017:IDM-17资源库,用于“ Internet技术”课程

    inet-2017 IDM-17资源库,用于“ Internet技术”课程需求说明: : 沙盒链接: : 本学期的项目:IDM-17-01: 游戏: : 聊天: : 购物车: : 图书馆: : IDM-17-02: 来自世界各地的食谱书: https : //github....

    inet2

    NULL 博文链接:https://vateran.iteye.com/blog/882696

    系统巡检脚本

    IPADDR=$(ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}') #环境变量PATH没设好,在cron里执行时有很多命令会找不到 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/...

    linux环境文件1(共2个)

    使用方法:下载2个文件放到一个文件夹内,解压缩,用虚拟机打开Debian。 登录用户名:root ,密码:debian ,输入ifconfig 获取IP地址(第二行inet后内容)。 打开vscode,ctrl+p 打开命令中心,输入 >ssh:connect to ...

    inet3

    NULL 博文链接:https://vateran.iteye.com/blog/883840

    UDP.rar_IPPROTO_UDP_UDP监听_WSAStartup_sock_DGRAM

    WSAStartup(MAKEWORD(2,2),&wsd) 3、创建socket: ReceivingSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) 4、初始化服务器地址及监听端口 ReceiverAddr.sin_family=AF_INET //家族 ReceiverAddr.sin_port=htons...

    inet

    Internet上的SteamBSD安装安装FreeBSD,重新启动PC并以root用户身份登录: su root 从git下载: pkg ins git git clone https://github.com/steambsd/inet cd inet 或下载而不安装git: fetch ...添加权限: chmod +x ...

    OPENWRT-ANGEL-GL-Inet:这只是学习

    2.不要忘记为gl-inet选择yes 3.安装后,安装angel beats simpan file ini http://pastebin.com/raw.php?i=e3A7rcFf lalu edit bagian IPYOUHOST alamat script editan_AGB (saya gak host filenya saya gak tau ...

    gitlab安装脚本

    IP=`ifconfig eth0| grep "inet addr" | head -1 | cut -d : -f2 | awk '{print $1}'` ############yum update ,add epel ,add PIIAS source yum_ () { cd /etc/yum.repos.d/ yum install -y wget wget -O /etc/pki...

    softap_ap6212a0_tinav2.1_验证通过_旧版本的系统_20170915_1223没有外层目录.7z

    2. tulip_d1-dragonboard 3. octopus_sch-tina 4. octopus_sch-dragonboard 5. azalea_perf2-tina 6. azalea_perf2-dragonboard 7. azalea_perf3-tina 8. azalea_perf3-dragonboard 9. octopus_dev-...

    磁盘恢复硬盘数据教程和免费软件

    格式化硬盘恢复数据教程(固态SSD、机械HHD),几个t的学习资料有救了。看到就省下几百块的恢复数据的钱。附详细操作教程CSDN博文和免费软件:...

    inet:为Veins_Hetvnet修改的INET

    CI状态主积分构建和指纹测试 功能启用测试用于OMNEST / OMNeT ++的INET框架是为OMNEST / OMNeT ++仿真系统编写的开源通信网络仿真包。 INET框架包含用于众多有线和无线协议的模型,详细的物理层模型,应用程序模型等...

    Programming-Paradigms-DD1361.Inet:实验室网络

    编程范式-DD1361.Inet Labb Inet:互联网/套接字 在这个实验室中,您将纠正和改进 ATM 程序。 要在实验室获得批准,您的程序必须有效、满足某些要求并记录在案。 该实验室的目的是研究面向 Internet 的编程,然后...

Global site tag (gtag.js) - Google Analytics