Add 2 crystal LibIPC examples.
parent
dcc8e7bfd9
commit
4ed4471c18
|
@ -0,0 +1,6 @@
|
||||||
|
/docs/
|
||||||
|
/lib/
|
||||||
|
/bin/
|
||||||
|
/.shards/
|
||||||
|
*.dwarf
|
||||||
|
shard.lock
|
|
@ -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
|
|
@ -0,0 +1,23 @@
|
||||||
|
name: libipc-examples
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- Philippe Pittoli <karchnu@karchnu.fr>
|
||||||
|
|
||||||
|
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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue