• 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.
  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/4710436.html
Copyright © 2020-2023  润新知