Erlang的套接字可以有三种打开模式:主动(active)、单次主动(active once)或被动(passive)。
这是通过在gen_tcp:connect(Address, Port, Options)或gen_tcp:listen(Port, Options)
的Options参数里加入{active, true | false | once}选项实现的。

如果指定{active, true}就会创建一个主动套接字,指定{active, false}则是被动套接
字。{active, once}创建的套接字只会主动接收一个消息,接收完之后必须重新启用才能接收
下一个消息。

一、主动型

当一个主动套接字被创建后,它会在收到数据时向控制进程发送{tcp, Socket, Data}
消息。控制进程无法控制这些消息流。恶意的客户端可以向系统发送成千上万的消息,
而它们都会被发往控制进程。控制进程无法阻止这些消息流。

进程无法控制通往服务器循环的消息流。如果客户端生成数据的速度快于服务器处理数
据的速度,系统就会遭受数据洪流的冲击:消息缓冲区会被塞满,系统可能会崩溃或表现异常。

{ok,Listen} = gen_tcp:listen(Port,[...,{active,true},...]),
{ok,Socket} = gen_tcp:accapt(Listen),
loop(Socket).
loop(Socket) ->
  receive
  {tcp,Socket,Data} ->
对数据进行操作
{tcp_closed,Socket} ->
....
end.

二、被动型

如果一个套接字是用被动模式打开的,控制进程就必须调用gen_tcp:recv(Socket, N)
来从这个套接字接收数据。然后它会尝试从套接字接收N个字节。如果N = 0,套接字就
会返回所有可用的字节。在这个案例里,服务器可以通过选择何时调用gen_tcp:recv来
控制客户端所发的消息流

{ok,Listen} = gen_tcp:listen(Port,[...,{active,true},...]),
{ok,Socket} = gen_tcp:accapt(Listen),
loop(Socket).
loop(Socket) ->
  case gen_tcp:recv(Socket,N) of
    {Ok, B} ->
...对数据进行操作...
loop(Socket);
{error,closed}
...
end.

三、混合型

既不是阻塞也不是非阻塞。用{active, once}选项打开套接字。套接字在这个模式下虽然是主动的,但只针对一个消息。当控制进程收到一个消
息后,必须显式调用inet:setopts才能重启下一个消息的接收,在此之前系统会处于阻塞状态。这种方法集合了前两种模式的优点

{ok,Listen} = gen_tcp:listen(Port,[...,{active,once},...]),
{ok,Socket} = gen_tcp:accapt(Listen),
loop(Socket).
loop(Socket) ->
  receive
  {tcp,Socket,Data} ->
对数据进行操作
准备接收下一个消息
inet:setopts(Socket,[{active,once}]),
loop(Socket);
{tcp_closed,Socket} ->
....
end.

erlang套接字的更多相关文章

  1. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  2. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  3. WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次

    websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...

  4. Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)

    我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次.  : AH00072: make_soc ...

  5. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  6. 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket

    这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...

  7. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  8. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  9. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

随机推荐

  1. HDU 4403 A very hard Aoshu problem

    暴力$dfs$. 先看数据范围,字符串最长只有$15$,也就是说枚举每个字符后面是否放置“$+$”号的复杂度为${2^{15}}$. 每次枚举到一种情况,看哪些位置能放“$=$”号,每个位置都试一下, ...

  2. 跑github上的Symfony项目遇到的问题

    Loading composer repositories with package information Installing dependencies (including require-de ...

  3. UNIX基础--安装应用程序: Packages 和 Ports

    Packages and Ports 概述 FreeBSD 将许多系统工具捆绑作为基本系统的一部分.另外,FreeBSD 提供了两种补充的技术来安装第三方软件:FreeBSD Ports Collec ...

  4. Scala 类和对象

    Scala class: Scala 源文件中可以有很多类(class),这些类默认都是Public的,public是Scala的默认访问级别.在Scala中,声明一个未用priavate修饰的字段 ...

  5. git出错

    查询git的版本是否装对  32 位  64位

  6. linux awk命令详解2

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...

  7. MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】

    不管是Oracle数据库还是SQL Server数据库,每个数据库都有自己的一套数据备份和恢复的方法,MySQL数据库也不例外.MySQL数据库备份和恢复用到了两个命令,分别是“mysqldump”和 ...

  8. canvas绘图基础及基于粒子系统的雪花飘落

    canvas是html中的一个元素,可以通过js操控绘图! 可以绘制各种图形,各种填充样式! 绘制时可以进行旋转,缩放,平移,但并不是很灵活! 有一对比较好用的方法是save restore! sav ...

  9. linux 文件和目录操作

    1 相对路径和绝对路径 (与C++中概念相似) cd /root/cat 绝对路径 cd ../文件名/ 相对路径,指相对某个文件而言的 2 切换目录 cd  当前目录 进入某个目录 pwd 显示当前 ...

  10. 一:python入门

    Python简介 这点就不做陈述了,相信各位朋友已经已经有了一定的了解. Python特色: 1:简单 第一次接触Python给我的感觉它的语法阅读就像是阅读一本英文书的目录一样,简单易懂,它的语法要 ...