Added socket-recv

This commit is contained in:
retropikzel 2025-12-21 14:54:52 +02:00
parent b063c39388
commit 5d544f32eb
3 changed files with 31 additions and 12 deletions

View File

@ -108,12 +108,13 @@
(c-type-size 'int))))) (c-type-size 'int)))))
(when (< addrinfo-result 0) (when (< addrinfo-result 0)
(c-perror (string->c-utf8 "make-client-socket (addrinfo) error")) (c-perror (string->c-utf8 "make-client-socket (addrinfo) error"))
(exit 1)) (raise-continuable "make-client-socket (addrinfo) error"))
(when (< socket-file-descriptor 0) (when (< socket-file-descriptor 0)
(c-perror (string->c-utf8 "make-client-socket error")) (c-perror (string->c-utf8 "make-client-socket error"))
(exit 1)) (raise-continuable "make-client-socket (socket) error"))
(when (< (c-fcntl socket-file-descriptor F-SETFL O-NONBLOCK) 0) (when (< (c-fcntl socket-file-descriptor F-SETFL O-NONBLOCK) 0)
(c-perror (string->c-utf8 "make-client-socket (fcntl) error"))) (c-perror (string->c-utf8 "make-client-socket (fcntl) error"))
(raise-continuable "make-client-socket (fcntl) error"))
(letrec* ((connect-result (letrec* ((connect-result
(c-connect socket-file-descriptor (c-connect socket-file-descriptor
;; ai-addr ;; ai-addr
@ -154,14 +155,14 @@
(sockaddr-size (+ ai-family-size (bytevector-length (string->utf8 node))))) (sockaddr-size (+ ai-family-size (bytevector-length (string->utf8 node)))))
(when (< socket-file-descriptor 0) (when (< socket-file-descriptor 0)
(c-perror (string->c-utf8 "make-client-socket error")) (c-perror (string->c-utf8 "make-client-socket error"))
(exit 1)) (raise-continuable "make-client-socket (socket) error"))
(when (< (c-fcntl socket-file-descriptor F-SETFL O-NONBLOCK) 0) (when (< (c-fcntl socket-file-descriptor F-SETFL O-NONBLOCK) 0)
(c-perror (string->c-utf8 "make-client-socket (fcntl) error")) (c-perror (string->c-utf8 "make-client-socket (fcntl) error"))
(exit 1)) (raise-continuable "make-client-socket (fcntl) error"))
(let ((connect-result (c-connect socket-file-descriptor sockaddr sockaddr-size))) (let ((connect-result (c-connect socket-file-descriptor sockaddr sockaddr-size)))
(when (< connect-result 0) (when (< connect-result 0)
(c-perror (string->c-utf8 "make-client-socket error")) (c-perror (string->c-utf8 "make-client-socket (connect) error"))
(exit 1)) (raise-continuable "make-client-socket (connect) error"))
(make-socket socket-file-descriptor)))) (make-socket socket-file-descriptor))))
(define (make-client-socket node service . args) (define (make-client-socket node service . args)
@ -196,7 +197,21 @@
(sent-count (c-send (socket-file-descriptor socket) msg msg-len 0))) (sent-count (c-send (socket-file-descriptor socket) msg msg-len 0)))
(when (= sent-count -1) (when (= sent-count -1)
(c-perror (string->c-utf8 "socket-send error")) (c-perror (string->c-utf8 "socket-send error"))
(exit 1)) (raise-continuable "socket-send error"))
sent-count)) sent-count))
(define (socket-recv-loop socket bytes-pointer size)
(let ((read-result (c-read (socket-file-descriptor socket)
bytes-pointer
size)))
(cond ((< read-result 1) (socket-recv-loop socket bytes-pointer size))
(else
(c-bytevector->bytevector bytes-pointer size)))))
(define (socket-recv socket size . flags)
;; TODO FIXME If connection is closed return empty bytevector
(let* ((msg-type (if (null? flags)
(message-type 'none)
(apply message-type flags)))
(bytes-pointer (make-c-bytevector size 0)))
(socket-recv-loop socket bytes-pointer size)))

View File

@ -6,10 +6,10 @@
(foreign c)) (foreign c))
(export make-client-socket (export make-client-socket
;make-server-socket ;make-server-socket
;socket? socket?
;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

View File

@ -1,8 +1,12 @@
;(define client-socket (make-client-socket "127.0.0.1" "3000")) (define client-socket (make-client-socket "127.0.0.1" "3000"))
(define client-socket (make-client-socket "/tmp/demo.sock" "3000" *af-unix*)) ;(define client-socket (make-client-socket "/tmp/demo.sock" "3000" *af-unix*))
(socket-send client-socket (string->utf8 "Hello from test")) (socket-send client-socket (string->utf8 "Hello from test"))
(display "HERE: ")
(write (utf8->string (socket-recv client-socket 5)))
(newline)
(write client-socket) (write client-socket)
(newline) (newline)