mirror of
https://github.com/sbrow/zomq.git
synced 2026-08-26 10:53:32 -04:00
feat: Initial echo server.
This commit is contained in:
@@ -1,5 +1,74 @@
|
||||
package main
|
||||
|
||||
main :: proc () {
|
||||
|
||||
import "core:bufio"
|
||||
import "core:fmt"
|
||||
import "core:os"
|
||||
import zmq "zmq"
|
||||
|
||||
main :: proc() {
|
||||
major, minor, patch := zmq.version()
|
||||
fmt.printfln("zmq echo (libzmq %d.%d.%d) over inproc; type lines, Ctrl-D to quit", major, minor, patch)
|
||||
|
||||
ctx := zmq.new_context()
|
||||
defer zmq.term(ctx)
|
||||
|
||||
rep := must_socket(ctx, .REP, "rep socket")
|
||||
defer zmq.close(rep)
|
||||
must(zmq.bind(rep, "inproc://echo"), "bind")
|
||||
|
||||
req := must_socket(ctx, .REQ, "req socket")
|
||||
defer zmq.close(req)
|
||||
must(zmq.connect(req, "inproc://echo"), "connect")
|
||||
|
||||
echo(req, rep)
|
||||
}
|
||||
|
||||
echo :: proc(req, rep: zmq.Socket) {
|
||||
scanner: bufio.Scanner
|
||||
bufio.scanner_init(&scanner, os.to_reader(os.stdin))
|
||||
defer bufio.scanner_destroy(&scanner)
|
||||
|
||||
buf: [1024]u8
|
||||
for bufio.scan(&scanner) {
|
||||
line := bufio.scanner_text(&scanner)
|
||||
if len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
if _, err := zmq.send(req, transmute([]u8)line); !zmq.is_ok(err) {
|
||||
fmt.eprintfln("send: %s", zmq.error_string(err))
|
||||
return
|
||||
}
|
||||
n, rerr := zmq.recv(rep, buf[:])
|
||||
if !zmq.is_ok(rerr) {
|
||||
fmt.eprintfln("rep recv: %s", zmq.error_string(rerr))
|
||||
return
|
||||
}
|
||||
if _, werr := zmq.send(rep, buf[:n]); !zmq.is_ok(werr) {
|
||||
fmt.eprintfln("rep send: %s", zmq.error_string(werr))
|
||||
return
|
||||
}
|
||||
m, qerr := zmq.recv(req, buf[:])
|
||||
if !zmq.is_ok(qerr) {
|
||||
fmt.eprintfln("req recv: %s", zmq.error_string(qerr))
|
||||
return
|
||||
}
|
||||
fmt.println(string(buf[:m]))
|
||||
}
|
||||
}
|
||||
|
||||
must :: proc(err: zmq.Error, at: string) {
|
||||
if !zmq.is_ok(err) {
|
||||
fatal(at, err)
|
||||
}
|
||||
}
|
||||
|
||||
must_socket :: proc(ctx: zmq.Context, type: zmq.Socket_Type, at: string) -> zmq.Socket {
|
||||
s, err := zmq.socket(ctx, type)
|
||||
must(err, at)
|
||||
return s
|
||||
}
|
||||
|
||||
fatal :: proc(at: string, err: zmq.Error) {
|
||||
fmt.eprintfln("%s: %s", at, zmq.error_string(err))
|
||||
os.exit(1)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user