GithubHelp home page GithubHelp logo

skyformat99 / esockd Goto Github PK

View Code? Open in Web Editor NEW

This project forked from emqx/esockd

0.0 2.0 0.0 3.05 MB

Erlang General Non-blocking TCP/SSL Socket Server

License: MIT License

Makefile 0.22% Erlang 99.78%

esockd's Introduction

eSockd Build Status

Erlang General Non-blocking TCP/SSL Socket Server.

Features

  • General Non-blocking TCP/SSL Socket Server
  • Acceptor Pool and Asynchronous TCP Accept
  • Parameterized Connection Module
  • Max connections management
  • Allow/Deny by peer address
  • Proxy Protocol V1/V2
  • Keepalive Support
  • Rate Limit
  • IPv6 Support

Usage

A Simple Echo Server:

-module(echo_server).

-export([start_link/1]).

start_link(Conn) ->
   {ok, spawn_link(?MODULE, init, [Conn])}.
      
init(Conn) ->
    {ok, NewConn} = Conn:wait(), loop(NewConn).

loop(Conn) ->
    case Conn:recv(0) of
        {ok, Data} ->
            {ok, PeerName} = Conn:peername(),
            io:format("~s - ~s~n", [esockd_net:format(peername, PeerName), Data]),
            Conn:send(Data),
            loop(Conn);
        {error, Reason} ->
            io:format("tcp ~s~n", [Reason]),
            {stop, Reason}
    end.

Setup Echo Server:

%% Start eSockd application
ok = esockd:start().

Options = [{acceptors, 10},
           {max_clients, 1024},
           {sockopts, [binary, {reuseaddr, true}]}].

MFArgs = {echo_server, start_link, []},

esockd:open(echo, 5000, Options, MFArgs).

Examples

Example Description
examples/async_recv prim_net async recv/send
examples/gen_server gen_server behaviour
examples/simple simple echo server
examples/ssl ssl echo server
examples/proxy_protocol proxy protocol v1/2

API

Open a Listener

esockd:open(echo, 5000, [{sockopts, [binary, {reuseaddr, true}]}], {echo_server, start_link, []}).

esockd:open(echo, {"127.0.0.1", 6000}, [{sockopts, [binary, {reuseaddr, true}]}], {echo_server, start_link, []}).

Spec:

-spec(open(Protocol, ListenOn, Options, MFArgs) -> {ok, pid()} | {error, any()} when
           Protocol :: atom(),
           ListenOn :: inet:port_number() | {inet:ip_address() | string(), inet:port_number()}),
           Options  :: [option()],
           MFArgs   :: esockd:mfargs()).

Options:

-type(option() :: {acceptors, pos_integer()}
                | {max_clients, pos_integer()}
                | {tune_buffer, false | true}
                | {access, [esockd_access:rule()]}
                | {logger, atom() | {atom(), atom()}}
                | {ssl, [ssl:ssloption()]}
                | {connopts, [connopt()]}
                | {sockopts, [gen_tcp:listen_option()]}).

MFArgs:

-type(mfargs() :: atom() | {atom(), atom()} | {module(), atom(), [term()]}).

Get Setting and Stats

Get stats:

esockd:get_stats({echo, 5000}).

Get acceptors:

esockd:get_acceptors({echo, {"127.0.0.1", 6000}}).

Get/Set max clients:

esockd:get_max_clients({echo, 5000}).
esockd:set_max_clients({echo, 5000}, 100000).

Allow/Deny

Same to Allow/Deny Syntax of nginx:

allow address | CIDR | all;

deny address | CIDR | all;

allow/deny by options:

esockd:open(echo, 5000, [
    {access, [{deny, "192.168.1.1"},
              {allow, "192.168.1.0/24"},
              {deny, all}]}], MFArgs).

allow/deny by API:

esockd:allow({echo, 5000}, all).
esockd:allow({echo, 5000}, "192.168.0.1/24").
esockd:deny({echo, 5000}, all).
esockd:deny({echo, 5000}, "10.10.0.0/16").

Close a Listener

.. code:: erlang

esockd:close(echo, 5000).
esockd:close(echo, {"127.0.0.1", 6000}).

Spec:

-spec(close(Protocol, ListenOn) -> ok when
            Protocol :: atom(),
            ListenOn :: inet:port_number() | {inet:ip_address() | string(), inet:port_number()}).

SSL

Connecting to ssl_echo_server:

openssl s_client -connect 127.0.0.1:5000 -ssl3

openssl s_client -connect 127.0.0.1:5000 -tls1

Logger

eSockd depends gen_logger.

Logger environment:

 {esockd, [
    {logger, {lager, info}}
 ]},

Logger option:

esockd:open(echo, 5000, [{logger, {error_logger, info}}], {echo_server, start_link, []}).

Design

Supervisor Tree

esockd_sup 
    -> esockd_listener_sup 
        -> esockd_listener
        -> esockd_acceptor_sup 
            -> esockd_acceptor
            -> esockd_acceptor
            -> ......
        -> esockd_connection_sup
            -> esockd_connection
            -> esockd_connection
            -> ......

Acceptor

  1. Acceptor Pool

  2. Sleep for a while when e{n, m}file errors happened

Connection Sup

  1. Create a connection, and let it run...

  2. Control max connections

  3. Count active connections

  4. Count shutdown reasons

CIDR

CIDR Wiki: https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing

Benchmark

Benchmark 2.1.0-alpha release on one 8 cores, 32G memory ubuntu/14.04 server::

250K concurrent connections, 50K messages/sec, 40Mbps In/Out consumed 5G memory, 20% CPU/core

License

The MIT License (MIT)

Author

Feng Lee [email protected]

esockd's People

Contributors

getong avatar grutabow avatar huangdan avatar joaohf avatar terry-xiaoyu avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.