Next: posix socket oob, Previous: posix socket misc, Up: posix socket [Index]
Basically a TCP/IP server should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8080))
(server-sock (px.socket PF_INET SOCK_STREAM 0)))
(px.bind server-sock sockaddr)
(px.listen server-sock 2)
(let-values (((sock client-address)
(px.accept server-sock)))
;; ... talk with the client through SOCK ...
(px.close sock))
(px.close server-sock))
while a TCP/IP client should to:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8080))
(sock (px.socket PF_INET SOCK_STREAM 0)))
(px.connect sock sockaddr)
;; ... talk to the server through SOCK ...
(px.close sock))
A UDP/IP “server” should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8080))
(sock (px.socket PF_INET SOCK_DGRAM 0))
(in-buffer (make-bytevector 1024))
(out-buffer (make-bytevector 1024)))
(px.bind sock sockaddr)
(let-values (((len sockaddr)
(px.recvfrom sock in-buffer #f 0)))
;; ... process the received packet ...
;; ... prepare the answer ...
(px.sendto sock out-buffer #f 0 sockaddr))
(px.close sock))
while a UDP/IP “client” should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8081))
(sock (px.socket PF_INET SOCK_DGRAM 0))
(out-buffer (make-bytevector 1024))
(in-buffer (make-bytevector 1024)))
(px.bind sock sockaddr)
;; ... prepare the request ...
(px.sendto sock out-buffer #f 0 sockaddr)
(let-values (((len sockaddr)
(px.recvfrom sock in-buffer #f 0)))
;; ... process the received packet ...
)
(px.close sock))
A Unix–domain socket server should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let* ((tmpdir (px.getenv "TMPDIR"))
(pathname (string-append tmpdir "/use-me"))
(sockaddr (px.make-sockaddr_un pathname))
(server-sock (px.socket PF_LOCAL SOCK_STREAM 0)))
(px.bind server-sock sockaddr)
(px.listen server-sock 2)
(let-values (((sock client-address)
(px.accept server-sock)))
;; ... talk to the client through SOCK ...
(px.close sock))
(px.close server-sock))
while a Unix–domain socket client should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let* ((tmpdir (px.getenv "TMPDIR"))
(pathname (string-append tmpdir "/use-me"))
(sockaddr (px.make-sockaddr_un pathname))
(sock (px.socket PF_LOCAL SOCK_STREAM 0)))
(px.connect sock sockaddr)
;; ... talk to the server through SOCK ...
(px.close sock))
To receive incoming data and Out Of Band data, a TCP/IP server should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8080))
(server-sock (px.socket PF_INET SOCK_STREAM 0)))
(px.bind server-sock sockaddr)
(px.listen server-sock 2)
(let*-values
(((sock client-address) (px.accept server-sock))
((bv) (make-bytevector 10)))
(let loop ()
(let-values (((rd wr ex) (px.select-fd sock 2 0)))
(cond (ex ;process exceptional conditions first!!!
;; block until OOB data arrives
(let ((len (px.recv sock bv #f MSG_OOB)))
;; process data in BV between 0 and LEN,
;; which should be 1
(loop)))
(rd
(let ((len (px.recv sock bv #f 0)))
(when (positive? len)
;; process data in BV between 0
;; and LEN
(loop))))
(else (loop)))))
(px.close sock))
(px.close server-sock))
to send outgoing data and Out Of Band data, a TCP/IP client should do:
#!r6rs
(import (rnrs)
(prefix (vicare posix) px.)
(vicare platform constants))
(let ((sockaddr (px.make-sockaddr_in '#vu8(127 0 0 1) 8080))
(sock (px.socket PF_INET SOCK_STREAM 0)))
(px.connect sock sockaddr)
(px.send sock '#vu8(1 2 3) #f 0)
;; only the single byte 6 (the last) is sent as
;; OOB data, 4 and 5 are sent as ordinary data
(px.send sock '#vu8(4 5 6) #f MSG_OOB)
(px.send sock '#vu8(7 8 9) #f 0)
(px.close sock))
Next: posix socket oob, Previous: posix socket misc, Up: posix socket [Index]