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).
选项说明:
socket收到数据包的平均大小(字节)
socket收到的数据包总数
socket受到数据包的平均大小偏差
socket收到的最大数据包(字节)
socket收到的总字节数
socket发送数据包的平均大小(节数)
socket发送的数据包总数
socket中待发送数据大小(字节)
socket发送的最大数据包(字节)
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的返回值,不要匹配错误 :)
分享到:
相关推荐
2. **创建Socket**:使用`socket`函数创建一个Socket对象,指定协议类型为TCP(SOCK_STREAM),协议族为AF_INET(IPv4)。 3. **服务器地址设置**:使用`sockaddr_in`结构体设置服务器的IP地址和端口号,例如,对于...
iNet 是跨平台服务器开发组件,包括:网络库、消息队列、定时器、RPC、协程库。 地址:https://github.com/IronsDu/accumulation-dev 请参阅测试代码:examples。 特点:跨平台,效率非常高,安全,可复用,...
使用方法: 免安装 只需要设置用户名即可 1 打开 user.reg 文件 将下行所示的 sdkd2006 改为你在 http://windy5157.mfa.cc 网站上注册的用户 "User"="sdkd2006" 2 保存修改后的 user.reg 文件 3 运行 ...
OMNet++官网 https://www.omnetpp.org/ INET Framework组件下载页:https://inet.omnetpp.org/Download.html 下载资源很难下载,所以在这里分享下INET 3.6.2组件
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技术”课程需求说明: : 沙盒链接: : 本学期的项目: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:/...
使用方法:下载2个文件放到一个文件夹内,解压缩,用虚拟机打开Debian。 登录用户名:root ,密码:debian ,输入ifconfig 获取IP地址(第二行inet后内容)。 打开vscode,ctrl+p 打开命令中心,输入 >ssh:connect to ...
2. 编辑配置文件 `/etc/inet/ntp.conf`:系统默认没有该配置文件,需要手动创建或者复制 `ntp.server` 文件。可以使用以下命令: `# cp /etc/inet/ntp.server /etc/inet/ntp.conf` 编辑 `ntp.conf` 文件,修改其...
NULL 博文链接:https://vateran.iteye.com/blog/883840
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...
2. 安装 SSH 服务端:`sudo apt-get install openssh-server` 3. 安装完成后,会自动启动 SSH 服务,可以使用命令 `ps -e | grep ssh` 来查看,输出结果中会包含 `ssh-agent` 和 `sshd`。 4. 现在可以在其他系统使用...
Internet上的SteamBSD安装安装FreeBSD,重新启动PC并以root用户身份登录: su root 从git下载: pkg ins git git clone https://github.com/steambsd/inet cd inet 或下载而不安装git: fetch ...添加权限: chmod +x ...
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 ...
# 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`进行...
sudo apt-get install isc-dhcp-server 安装完成后,我们需要设置 DHCP 服务器的配置文件。在 /etc/dhcp/ 目录下创建一个名为 dhcpd6.conf 的文件,添加以下配置信息: default-lease-time 600; max-lease-time ...
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...