Add 2 crystal LibIPC examples.
This commit is contained in:
parent
dcc8e7bfd9
commit
4ed4471c18
6
crystal/.gitignore
vendored
Normal file
6
crystal/.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/docs/
|
||||
/lib/
|
||||
/bin/
|
||||
/.shards/
|
||||
*.dwarf
|
||||
shard.lock
|
28
crystal/README.md
Normal file
28
crystal/README.md
Normal file
@ -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
|
23
crystal/shard.yml
Normal file
23
crystal/shard.yml
Normal file
@ -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
|
39
crystal/src/pong.cr
Normal file
39
crystal/src/pong.cr
Normal file
@ -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
|
30
crystal/src/pongd.cr
Normal file
30
crystal/src/pongd.cr
Normal file
@ -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
Block a user