Skip to content

Instantly share code, notes, and snippets.

@Metaxal
Last active December 16, 2015 11:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Metaxal/5426707 to your computer and use it in GitHub Desktop.
Save Metaxal/5426707 to your computer and use it in GitHub Desktop.
Unix domain socket communication test
#lang racket
(require (planet shawnpresser/racket-unix-sockets)
"communicate.rkt")
(define-values (i o)
(unix-socket-connect socket-path))
(communicate i o)
#lang racket
(provide
socket-path
(contract-out (communicate (-> input-port? output-port? void))))
(define socket-path (build-path (find-system-path 'pref-dir) "tmp-socket"))
(define (communicate i o)
(let loop ()
(display "Send: ")
(flush-output)
(sync/enable-break
(handle-evt (port-closed-evt i)
(λ(p)(displayln "Port i closed")))
(handle-evt (port-closed-evt o)
(λ(p)(displayln "Port o closed")))
(handle-evt (read-line-evt (current-input-port))
(λ(str)
(unless (or (port-closed? o) (port-closed? i))
(displayln str o)
(flush-output o)
(unless (or (equal? str "exit") (eof-object? str))
(loop)))))
(handle-evt (read-line-evt i)
(λ(str)
(unless (or (equal? str "exit") (eof-object? str))
(displayln (string-append "Received: " str))
(loop))))))
(close-input-port i)
(close-output-port o))
#lang racket
(require (planet shawnpresser/racket-unix-sockets)
"communicate.rkt")
(define (serve path)
(define listener (unix-socket-listen path 1))
(printf "listening: ~a\n" listener)
;; Problem: unix-socket-accept does not allow breaks.
;; It should be used with scheme_call_enable_break:
;; https://github.com/plt/racket/blob/6e0492dff0813b1c305398f9607bd31491645b46/src/racket/src/network.c#L2078
;; http://docs.racket-lang.org/inside/threads.html#%28cpp._scheme_call_enable_break%29
(define-values (i o) (unix-socket-accept listener))
(printf "accepted: ~a\n" listener)
(communicate i o)
(printf "Finished listener ~a\n " listener)
)
(module+ main
(when (file-exists? socket-path)
(delete-file socket-path))
(serve socket-path))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment