On Apr 5, 2020, at 1:59 AM, Alejandro Santana santana@mailbox.org wrote:
Thanks for the explanation.
BTW, why do you need this?
Just learning scheme and c. I wanted to have gambit receive s-exps over a unix domain socket. I figured it would be simplest if I could turn the file descriptor returned from accept into a port and call scheme's read on it. I can do without this though and I'd rather not have ports piling up.
No need to muck around with file descriptors to do this. The following program is better as it is portable to linux, macOS and Windows:
(define (start-server local-address handler) (let ((listen-port (open-tcp-server local-address))) (let loop () (handler (read listen-port)) (loop))))
(start-server "*:12345" (lambda (conn) (pretty-print (list 'msg= (read conn))) (close-port conn)))
In another terminal you can send a message to the server with:
% echo "(hello world)" | nc localhost 12345
A server for handling incoming connections can be created even more simply with tcp-service-register! :
(thread-join! (tcp-service-register! "*:12345" (lambda () (pp (list 'msg= (read))))))
I'm curious though if there's a better way to turn a file descriptor into a port. ##open-predefined is what I saw mentioned when I searched the mailing list.
I have added a commit (4a9c3f8dbbbb13d587e6ffec51c5bc87bc9dc666) that fixes this issue. Now the automatic forcing on program termination will no longer happen on file descriptors passed to ##open-predefined. Your fdes.scm program no longer “leaks” memory.
Marc