2020-07-09 08:03:55 +00:00
|
|
|
(load "../bindings/libc.scm")
|
|
|
|
|
|
|
|
(define (check-err ret msg)
|
|
|
|
(cond
|
|
|
|
((< ret 0)
|
|
|
|
(perror msg)
|
|
|
|
(raise msg))
|
|
|
|
(#t ret)))
|
|
|
|
|
2020-07-09 10:51:53 +00:00
|
|
|
(define (alloc size fx)
|
|
|
|
(let ([v (foreign-alloc size)])
|
|
|
|
(fx v)
|
|
|
|
(foreign-free v)))
|
|
|
|
|
2020-07-09 10:15:00 +00:00
|
|
|
(define (udpsock-create fx)
|
2020-07-09 08:03:55 +00:00
|
|
|
(fx
|
|
|
|
(check-err
|
2020-07-09 10:12:38 +00:00
|
|
|
(socket 'AF_INET 'SOCK_DGRAM 'IPPROTO_IP)
|
2020-07-09 08:03:55 +00:00
|
|
|
"Unable to init UDP socket")))
|
|
|
|
|
2020-07-09 10:15:00 +00:00
|
|
|
(define (udpsock-reuseaddr sock)
|
|
|
|
(alloc
|
|
|
|
(ftype-sizeof int)
|
|
|
|
(lambda (activation)
|
|
|
|
(foreign-set! 'int activation 0 1)
|
|
|
|
(check-err
|
|
|
|
(setsockopt
|
|
|
|
sock
|
|
|
|
'SOL_SOCKET
|
|
|
|
'SO_REUSEADDR
|
|
|
|
activation
|
|
|
|
(ftype-sizeof int))
|
|
|
|
"Unable to set REUSE ADDRESS"))))
|
|
|
|
|
2020-07-09 12:16:50 +00:00
|
|
|
(define (udpsock-bind sock host port)
|
2020-07-09 10:51:53 +00:00
|
|
|
(alloc
|
|
|
|
(ftype-sizeof sockaddr_in)
|
2020-07-09 12:16:50 +00:00
|
|
|
(lambda (raw-addr)
|
|
|
|
(let ([addr (make-ftype-pointer sockaddr_in raw-addr)])
|
|
|
|
(ftype-set! sockaddr_in (sin_family) addr (domain->int 'AF_INET))
|
|
|
|
(ftype-set! sockaddr_in (sin_port) addr (htons port))
|
|
|
|
(check-err
|
|
|
|
(inet_pton
|
|
|
|
'AF_INET
|
|
|
|
host
|
|
|
|
(ftype-pointer-address
|
|
|
|
(ftype-&ref sockaddr_in (sin_addr) addr)))
|
|
|
|
"Unable to convert your IP address to binary")
|
|
|
|
(bind
|
|
|
|
sock
|
|
|
|
(ftype-pointer-address addr)
|
|
|
|
(ftype-sizeof sockaddr_in))))))
|
2020-07-09 10:51:53 +00:00
|
|
|
|
2020-07-09 10:15:00 +00:00
|
|
|
(udpsock-create
|
2020-07-09 10:51:53 +00:00
|
|
|
(lambda (sock)
|
|
|
|
(udpsock-reuseaddr sock)
|
|
|
|
(udpsock-bind sock "0.0.0.0" 1337)
|
|
|
|
(printf "~a~%" sock)))
|