Binding an input creates a listening socket on a local port and binds the socket data to a local accessible buffer (accessible with the native `read` call).
-`$id` is a unique arbitrary name you must give to the listening binding
-`$port` is the number of the local port to listen to (between 1024 and 49151)
*Execution:*
- The `bind-input` execution will last until the socket is created, then it will move it to a background process and print its *PID*.
- In order to close properly the `bind-input`, you must kill its *PID* with one of the 3 following signals: SIGINT, SIGHUP, SIGTERM. Note that you must not use *SIGKILL* because it won't trigger the "*proper closing*" routine.
Let's say that you want to listen to port 9999, then read every second. You want to ignore empty messages (if nothing received), and end the program when you receive the message "**END**".
-`$id` is a unique arbitrary name you must give to the output binding
-`$host` is the hostname (IP addr. or resolvable) of the machine to connect to.
-`$port` is the number of the remote port to connect to (between 1024 and 49151)
*Execution:*
- The `bind-output` execution will last until the socket is created, then it will move it to a background process and print its *PID*.
- In order to close properly the `bind-output`, you must kill its *PID* with one of the 3 following signals: SIGINT, SIGHUP, SIGTERM. Note that you must not use *SIGKILL* because it won't trigger the "*proper closing*" routine.
This package includes a purpose-specific implementation:
-`master` pushes a pool of daemons (infinite scripts echoing things over time) bound to a pool receiver.
-`pool` waits for daemons to be started to bind input buffers.
### Pool receiver
The `pool` commands allows you to wait for daemons on a port.
```bash
pool $key $port
```
*Arguments:*
-`$key` is the key for the pool receiver, the _master_ must match it in order for the communication to be validated.
-`$port` is the number of the local port to listen on (between 1024 and 49151).
*Execution:*
1. Waits for incoming _daemon_request_ from `master` (asks for binding an input for a daemon). If the *END message* is received, stop listening and wait for background bindings to stop.
2. For each daemon, open a free port (`bind-input` in background), then return its number to the `master`
*Signals:*
- If one of these signals: SIGHUP, SIGTERM, SIGINT is received, all processes, sockets and background routines will be properly (recursively) stopped.
- You **must avoid SIGKILL**, because nothing can be triggered (by definition), so all sockets and binding will remain active.
### Pool creator (master)
The `master` commands allows you to bind daemons output to another machine.
```bash
master $key $host $port $ddir
```
*Arguments:*
-`$key` is the key for the pool receiver, if it does not match, it won't work.
-`$host` is the hostname (IP addr. or resolvable) of the machine powering the `pool` receiver.
-`$port` is the number of the remote port the pool is listening on (between 1024 and 49151).
-`$ddir` is the directory containing the daemon files (must be executable).
*Execution:*
1. Send _daemon_request_ for each daemon, when open port received, start daemon in background bound to output on `$host`
2. Send the *END message*
3. Wait for daemons and output to end
*Signals:*
- If one of these signals: SIGHUP, SIGTERM, SIGINT is received, all processes, sockets and background routines will be properly (recursively) stopped.
- You **must avoid SIGKILL**, because nothing can be triggered (by definition), so all sockets and binding will remain active.
*Exemple master-pool:*
Let's say the master has 2 daemons: _dem1_ and _dem2_. Both contains a while loop echoing something each second. In this example, the key is "**k12**".
```
ip: ipM ip: ipP
listen: pM listen: pP
+--------+ +--------+
| master | | pool |
+--------+ +--------+
| |
________|________ ______|_______
/ \ / \
| connect to ipP:pP | =============> | listen on pP |