`
litaocheng
  • 浏览: 337655 次
  • 性别: 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来做游戏服务端的技术与技巧,最近老大你的两篇文章很受用啊,支持 一下!~

相关推荐

    VC++ 9 socket HTTP

    2. **创建Socket**:使用`socket`函数创建一个Socket对象,指定协议类型为TCP(SOCK_STREAM),协议族为AF_INET(IPv4)。 3. **服务器地址设置**:使用`sockaddr_in`结构体设置服务器的IP地址和端口号,例如,对于...

    跨平台服务器开发组件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 运行 ...

    INET 3.6.2

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

    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....

    系统巡检脚本

    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 ...

    Solaris10NTP服务端和客户端配置

    2. 编辑配置文件 `/etc/inet/ntp.conf`:系统默认没有该配置文件,需要手动创建或者复制 `ntp.server` 文件。可以使用以下命令: `# cp /etc/inet/ntp.server /etc/inet/ntp.conf` 编辑 `ntp.conf` 文件,修改其...

    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...

    在Ubuntu操作系统中开启SSH服务和设置IP的步骤.docx

    2. 安装 SSH 服务端:`sudo apt-get install openssh-server` 3. 安装完成后,会自动启动 SSH 服务,可以使用命令 `ps -e | grep ssh` 来查看,输出结果中会包含 `ssh-agent` 和 `sshd`。 4. 现在可以在其他系统使用...

    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 ...

    set ntp server for solaris

    # cp -p /etc/inet/ntp.server /etc/inet/ntp.conf ``` - 接着,编辑 `ntp.conf` 文件: ``` # vi /etc/inet/ntp.conf ``` - 在文件中,将 `XType` 改为 1,表示本地(local)时钟: ``` server 127.127....

    邮件服务器安装配置

    - 若未安装,可使用软件包管理工具如yum或apt-get进行安装。 #### 四、安装与配置Cyrus IMAPD 1. **编译安装Cyrus IMAPD** - 进入Cyrus IMAP源码目录,执行`./configure --without-openssl --without-snmp`进行...

    IPV6-dhcp服务器搭建步骤

    sudo apt-get install isc-dhcp-server 安装完成后,我们需要设置 DHCP 服务器的配置文件。在 /etc/dhcp/ 目录下创建一个名为 dhcpd6.conf 的文件,添加以下配置信息: default-lease-time 600; max-lease-time ...

    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...

Global site tag (gtag.js) - Google Analytics