• erlang套接字


    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.
  • 相关阅读:
    002-mybatis主配置文件
    001-mybatis框架
    mybatis学习
    tcp连接与释放
    浏览器输入url的全过程
    设备
    读写分离(三)
    读写分离(二)
    读写分离(一)
    主从复制(三)
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/4710436.html
Copyright © 2020-2023  润新知