- 浏览: 51906 次
- 性别:
- 来自: 广州
最新评论
一、erlang socket的消息流的三种控制方式:
1 主动模式 {active, true}
2 被动模式 {active, false}
3 混合模式 {active, once}
1 主动消息获取(非阻塞)
在该模式下,无法控制发到服务端的消息流,如果客户端生产消息的速度大于服务端消费消息的速度,会导致服务端消息缓冲区溢出
2 被动消息获取(阻塞)
被动模式下,每收到一条信息,进行阻塞,防止危险客户端消息洪水的袭击
服务器调用gen_tcp:recv来接收数据,客户端在服务端调用recv前被阻塞
3 混合模式(半阻塞)
服务器以一次主动模式{active,once}接收且仅能接收一条消息,在接收消息后,必须明确调用inet:setopts恢复socket来接收下一条消息。系统在这发生前,一直处于阻塞状态
二、socket的控制进程
创建socket的进程(调用gen_tcp:accept或gen_tcp:connect)叫做这个socket的控制进程,所有来自socket的消息都会被发送到控制进程,如果控制进程死掉,对应的socket会被关闭,
可以通过gen_tcp:controlling_process(Socket, Pid)来修改socket的控制进程。
1 主动模式 {active, true}
2 被动模式 {active, false}
3 混合模式 {active, once}
1 主动消息获取(非阻塞)
在该模式下,无法控制发到服务端的消息流,如果客户端生产消息的速度大于服务端消费消息的速度,会导致服务端消息缓冲区溢出
{ok, ListenSocket} = gen_tcp:listen(Port, [...,{active,true}...], {ok, Socket} = gen_tcp:accept(ListenSocket} loop_receive(Socket). loop_receive(Socket) -> receive {tcp, Socket, Bin} -> ... loop_receive(Socket); {tcp_closed, Socket} -> ... end.
2 被动消息获取(阻塞)
被动模式下,每收到一条信息,进行阻塞,防止危险客户端消息洪水的袭击
{ok, ListenSocket} = gen_tcp:listen(Port, [...,{active,false}...], {ok, Socket} = gen_tcp:accept(ListenSocket} loop_receive(Socket). loop_receive(Socket) -> case gen_tcp:recv(Socket, N) of {ok, Packet} -> ... loop_receive(Socket); {error, reason} -> ... end.
服务器调用gen_tcp:recv来接收数据,客户端在服务端调用recv前被阻塞
3 混合模式(半阻塞)
服务器以一次主动模式{active,once}接收且仅能接收一条消息,在接收消息后,必须明确调用inet:setopts恢复socket来接收下一条消息。系统在这发生前,一直处于阻塞状态
{ok, ListenSocket} = gen_tcp:listen(Port, [...,{active,once}...], {ok, Socket} = gen_tcp:accept(ListenSocket} loop_receive(Socket). loop_receive(Socket) -> receive {tcp, Socket, Bin} -> ... inet:setopts(Socket,[{active,once}]), loop_receive(Socket); {tcp_closed, Socket} -> ... end.
二、socket的控制进程
创建socket的进程(调用gen_tcp:accept或gen_tcp:connect)叫做这个socket的控制进程,所有来自socket的消息都会被发送到控制进程,如果控制进程死掉,对应的socket会被关闭,
可以通过gen_tcp:controlling_process(Socket, Pid)来修改socket的控制进程。
发表评论
-
erlang-Astart算法
2018-07-02 08:34 487%%%-------------------------- ... -
erlang--常用内建函数收录
2016-07-15 15:43 5371:gen_event:which_handlers(Even ... -
erlang异常--try...catch
2016-07-13 19:48 947触发异常 throw(Term) exit(Reason ... -
erlang-退出信号捕捉trap_exit
2016-07-12 09:54 1040进程链接的工作: A进程意外退出时,会产生一个退出信号。所 ... -
Erlang--随机数
2016-04-25 10:26 19781、普通随机 random:uniform(N) 2、以时间 ... -
Erlang--性能分析工具之eprof
2016-04-12 18:22 686eprof是erlang自带的一个性能分析工具,可以帮助我 ... -
Erlang监控工具(二)etop
2016-04-07 17:46 1788file:///D:/Program%20Files/er ... -
Erlang监控工具(一)observer
2016-04-05 15:17 1278Erlang系统本身携带一个图形化监控工具,它可以监控:系 ... -
Erlang--epmd
2016-03-30 14:13 614epmd Erlang Port Mapper Daemo ... -
Erlang--节点
2016-03-30 11:25 735Erlang节点 file:///D:/Program%20F ... -
小技巧收录----唯一ID
2016-03-08 14:34 923在游戏开发中,角色id或者公会id等都需要做唯一设计, ... -
Erlang--TCP学习(四)并行web server篇
2015-07-14 20:09 683-module(tcp_parallel_server). ... -
Erlang--TCP学习(三)串行web server篇
2015-07-14 19:35 510简单web sever改进版:串行服务器,一次只接受一个连 ... -
Erlang--TCP学习(二)简单web_Server篇
2015-07-14 16:39 1031现在来写个简单的web服务器,要实现的功能是:只接受一个s ... -
Erlang--TCP学习(一)Client篇
2015-07-14 16:39 738gen_tcp:connect(Host,Port,[Op ... -
erlang sasl错误日志
2015-04-22 16:03 1422SASL (System Architecture Sup ... -
erl启动参数
2015-04-20 16:54 1056erl启动参数分类 1 emulator flags 用“ ... -
Erlang和SMP
2015-04-17 15:44 1712SMP:Symmetrical Multi Processor ... -
写个makefile编译erlang_protobuffs
2015-03-16 20:23 1599erlang_protobuffs源码下载地址: https: ... -
erlang安装
2015-03-09 17:38 702erlang安装 1 解压包 tar -zxvf otp_s ...
相关推荐
标题中的"erlang-23.2.3-1.el7.x86_64.rpm"和"erlang-23.2.1-1.el7.x86_64.rpm.rar"代表了两个不同的Erlang版本。`.rpm`文件是用于Red Hat Enterprise Linux (RHEL) 和其衍生发行版如CentOS的软件包管理格式,而`....
erlang-gen_tcp手册,详细完整,网络tcp开发好东东
总结,"erlang-22.3-1.el7.x86_64.rpm"是一个专为RabbitMQ准备的Erlang版本,适合在RHEL 7或类似系统上运行,利用Erlang的并发、分布式和容错特性来保证RabbitMQ的稳定性和效率。通过RPM包的形式,用户可以便捷地在...
"erlang-rpm-21.3.4.zip"是一个包含Erlang版本21.3.4的RPM(Red Hat Package Manager)包的压缩文件,适用于Linux操作系统,尤其是基于RPM包管理系统的发行版,如CentOS、Fedora和RHEL等。 Erlang的主要特点包括: ...
erlang-24.3.3-1.el9.x86_64.rpm centos
erlang-21.3-1.el7.x86_64.rpm rabbitmq基础语言环境。
在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的安装包。这个版本的Erlang包含了必要的组件和服务,使得它能够在CentOS 7上稳定...
erlang-20.3-1.el7.centos.x86_64.rpm
erlang-24.0.3-1.el8.x86_64.rpm资源
erlang-sd_notify-1.0-2.el7.x86_64.rpm
erlang-erts-19.3.6.4-1.el7.x86_64.rpm
erlang-xmerl-23.0.2-2.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
标题中的"erlang-19.0.4-1.el7.centos.x86_64.zip"揭示了我们讨论的是Erlang的一个特定版本——19.0.4,该版本针对的是Linux发行版CentOS 7的64位架构。Erlang的版本号通常包括主要版本号、次要版本号和补丁版本号,...
erlang-20.3.8.17-1.el7.centos.x86_64
erlang-21.3.1-1.el7.x86_64.rpm
- 使用yum安装Erlang:`sudo yum install erlang-23.3.4.3-1.el7.x86_64.rpm` 2. **安装RabbitMQ**: - 下载RabbitMQ RPM包:`wget https://your_download_link/rabbitmq-server-3.8.17-1.el7.noarch.rpm` - ...
erlang-xmerl-22.3-1.el7.x86_64.rpm,rabbitMQ安装需要依赖此环境。Erlang 是一种多用途编程语言,主要用于开发并发和分布式系统。它最初是一种专有的编程语言,Ericsson 使用它来开发电话和通信应用程序。
erlang-19.0.4-1.el7.centos.x86_64.rpm ,官网的正式包
erlang-23.1-1.el8.x86_ ,erlang官网下载很慢,所以提供该下载链接。