diff --git a/crystal/.gitignore b/crystal/.gitignore new file mode 100644 index 0000000..43c3d91 --- /dev/null +++ b/crystal/.gitignore @@ -0,0 +1,6 @@ +/docs/ +/lib/ +/bin/ +/.shards/ +*.dwarf +shard.lock diff --git a/crystal/README.md b/crystal/README.md new file mode 100644 index 0000000..dab6c23 --- /dev/null +++ b/crystal/README.md @@ -0,0 +1,28 @@ +# LibIPC examples + +Crystal LibIPC examples, using [libipc bindings shard][bindings]. + +## Installation + +```sh +# Compiles all examples. +shards build +``` + +Currently there are 2 examples: +- pongd (server): repeating every message +- pong (client): sending a message to the pong service and waiting for response + +## Usage + +```sh +# Run the service +./bin/pongd # run the service +./bin/pong # run the client +``` + +# LICENCE + +ISC + +[bindings]: https://git.baguette.netlib.re/Baguette/ipc.cr diff --git a/crystal/shard.yml b/crystal/shard.yml new file mode 100644 index 0000000..58f7bf4 --- /dev/null +++ b/crystal/shard.yml @@ -0,0 +1,23 @@ +name: libipc-examples +version: 0.1.0 + +authors: + - Philippe Pittoli + +description: | + Examples of applications using libipc. + +targets: + pong: + main: src/pong.cr + pongd: + main: src/pongd.cr + +dependencies: + ipc: + git: https://git.baguette.netlib.re/Baguette/ipc.cr + branch: master + +crystal: 1.7.1 + +license: ISC diff --git a/crystal/src/pong.cr b/crystal/src/pong.cr new file mode 100644 index 0000000..b138b56 --- /dev/null +++ b/crystal/src/pong.cr @@ -0,0 +1,39 @@ +require "ipc" + +ipc = IPC.new +ipc.timer 5000 # timer event every 5 seconds +fd = ipc.connect "pong" # 'pong' service + +# Schedule a message to send to a particular file descriptor +ipc.schedule fd, "Hello this is me!" + +ipc.loop do |event| + case event.type + when LibIPC::EventType::MessageRx + m = event.message + if m.nil? + puts "Err, should have received smth :(" + exit 1 + else + received = String.new(m.to_unsafe, m.size) + puts "msg received: #{received}" + if "Hello this is me!".compare(received) == 0 + puts "All good! Goodbye!" + exit 0 + end + puts "Received message isn't what was expected!" + exit 1 + end + when LibIPC::EventType::MessageTx + puts "A message has been sent" + when LibIPC::EventType::Connection + puts "A client just connected #JOY" + when LibIPC::EventType::Disconnection + puts "A client just disconnected #SAD" + when LibIPC::EventType::Timer + STDOUT.write "\rTimer!".to_slice + else + puts "Unexpected: #{event.type}" + exit 1 + end +end diff --git a/crystal/src/pongd.cr b/crystal/src/pongd.cr new file mode 100644 index 0000000..9b0b5cf --- /dev/null +++ b/crystal/src/pongd.cr @@ -0,0 +1,30 @@ +require "ipc" + +ipc = IPC.new +ipc.timer 5000 # timer event every 5 seconds +fd = ipc.service_init "pong" + +ipc.loop do |event| + case event.type + when LibIPC::EventType::MessageRx + m = event.message + if m.nil? + puts "No message" + else + received = String.new(m.to_unsafe, m.size) + pp! received + ipc.schedule event.fd, m, m.size + end + when LibIPC::EventType::MessageTx + puts "A message has been sent" + when LibIPC::EventType::Connection + puts "A client just connected #JOY" + when LibIPC::EventType::Disconnection + puts "A client just disconnected #SAD" + when LibIPC::EventType::Timer + STDOUT.write "\rTimer!".to_slice + else + puts "Unexpected: #{event.type}" + exit 1 + end +end