Implement most of SRFI-106 TCP side

This commit is contained in:
retropikzel 2026-01-02 14:43:59 +02:00
parent 0459168013
commit aa6044f1b9
4 changed files with 87 additions and 8 deletions

View File

@ -26,6 +26,7 @@
(define-c-procedure c-poll libc 'poll 'int '(pointer int int)) (define-c-procedure c-poll libc 'poll 'int '(pointer int int))
(define-c-procedure c-strcpy libc 'strcpy 'int '(pointer pointer)) (define-c-procedure c-strcpy libc 'strcpy 'int '(pointer pointer))
(define-c-procedure c-close libc 'close 'int '(int)) (define-c-procedure c-close libc 'close 'int '(int))
(define-c-procedure c-shutdown libc 'shutdown 'int '(int int))
(define-record-type <socket> (define-record-type <socket>
@ -320,3 +321,58 @@
(c-perror (string->c-utf8 "socket-accept (accept) error")) (c-perror (string->c-utf8 "socket-accept (accept) error"))
(raise-continuable "socket-accept (accept) error")) (raise-continuable "socket-accept (accept) error"))
(make-socket accepted-socket))) (make-socket accepted-socket)))
(define (call-with-socket socket thunk)
(let ((result (apply thunk (list socket))))
(socket-close socket)
result))
(define (socket-shutdown socket how)
(c-shutdown (socket-file-descriptor socket) how))
(define-syntax address-family
(syntax-rules ()
((_ name)
(cond ((symbol=? 'name 'inet) *af-inet*)
((symbol=? 'name 'inet6) *af-inet6*)
((symbol=? 'name 'unspec) *af-unspec*)
((symbol=? 'name 'unix) *af-unix*)
(else (error "address-family: Unrecognized name" name))))))
(define-syntax address-info
(syntax-rules ()
((_ names ...)
(apply socket-merge-flags
(map (lambda (name)
(cond ((symbol=? name 'canoname) *ai-canoname*)
((symbol=? name 'numerichost) *ai-numerichost*)
((symbol=? name 'v4mapped) *ai-v4mapped*)
((symbol=? name 'all) *ai-all*)
((symbol=? name 'addrconfig) *ai-addrconfig*)
(else (error "address-info: Unrecognized name" name))))
'(names ...))))))
(define-syntax socket-domain
(syntax-rules ()
((_ name)
(cond ((symbol=? 'name 'stream) *sock-stream*)
((symbol=? 'name 'datagram) *af-unix*)
(else (error "socket-domain: Unrecognized name" name))))))
(define-syntax ip-protocol
(syntax-rules ()
((_ name)
(cond ((symbol=? 'name 'ip) *ipproto-ip*)
((symbol=? 'name 'tcp) *ipproto-tcp*)
((symbol=? 'name 'udp) *ipproto-udp*)
(else (error "ip-protocol: Unrecognized name" name))))))
(define-syntax shutdown-method
(syntax-rules ()
((_ names ...)
(cond ((and (member 'read '(names ...))
(member 'write '(names ...)))
*shut-rdwr*)
((symbol=? (member 'read '(names ...)) 'read) *shut-rd*)
((symbol=? (member 'write '(names ...)) 'write) *shut-wr*)
(else (error "shutdown-method: Names must be either read, write or both"))))))

View File

@ -10,17 +10,17 @@
socket-accept socket-accept
socket-send socket-send
socket-recv socket-recv
;socket-shutdown socket-shutdown
socket-close socket-close
;socket-input-port ;socket-input-port
;socket-output-port ;socket-output-port
;call-with-socket call-with-socket
;address-family address-family
;address-info address-info
;socket-domain socket-domain
;ip-protocol ip-protocol
;message-type message-type
;shutdown-method shutdown-method
socket-merge-flags socket-merge-flags
socket-purge-flags socket-purge-flags
*af-inet* *af-inet*

View File

@ -1 +1,7 @@
SRFI-106: Basic socket interface SRFI-106: Basic socket interface
Not implemented yet:
- socket-input-port
- socket-output-port

View File

@ -1,4 +1,21 @@
(display "HERE address-family: ")
(write (address-family inet))
(newline)
(display "HERE address-info: ")
(write (address-info v4mapped addrconfig))
(newline)
(display "HERE socket-domain:")
(write (socket-domain stream))
(newline)
(display "HERE ip-protocol: ")
(write (ip-protocol ip))
(newline)
(define-c-library libc `("stdlib.h") libc-name '((additional-versions ("0" "6")))) (define-c-library libc `("stdlib.h") libc-name '((additional-versions ("0" "6"))))
(define-c-procedure c-system libc 'system 'int '(pointer)) (define-c-procedure c-system libc 'system 'int '(pointer))