mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 13:49:17 +02:00
Supporting inet6 addresses in sockaddr-name.
This commit is contained in:
parent
85548cc9c8
commit
a05a97fc1d
3 changed files with 39 additions and 4 deletions
29
examples/echo-server-inet6.scm
Normal file
29
examples/echo-server-inet6.scm
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/usr/bin/env chibi-scheme
|
||||||
|
|
||||||
|
(import (scheme base) (scheme write) (chibi net) (chibi net server))
|
||||||
|
|
||||||
|
;; Copy each input line to output.
|
||||||
|
(define (echo-handler in out sock addr)
|
||||||
|
(let ((line (read-line in)))
|
||||||
|
(cond
|
||||||
|
((not (or (eof-object? line) (equal? line "")))
|
||||||
|
;; log the request to stdout
|
||||||
|
(display "read: ") (write line)
|
||||||
|
(display " from ")
|
||||||
|
(display (sockaddr-name (address-info-address addr)))
|
||||||
|
(display " port ") (write (sockaddr-port (address-info-address addr)))
|
||||||
|
(newline)
|
||||||
|
;; write and flush the response
|
||||||
|
(display line out)
|
||||||
|
(newline out)
|
||||||
|
(flush-output-port out)
|
||||||
|
(echo-handler in out sock addr)))))
|
||||||
|
|
||||||
|
(define (get-inet6-address-info host service)
|
||||||
|
(let ((hints (make-address-info address-family/inet6
|
||||||
|
socket-type/stream
|
||||||
|
ip-proto/tcp)))
|
||||||
|
(get-address-info host service hints)))
|
||||||
|
|
||||||
|
;; Start the server on local ipv6 addresses on port 5556.
|
||||||
|
(run-net-server (get-inet6-address-info #f 5556) echo-handler)
|
|
@ -81,10 +81,15 @@ sexp sexp_listen (sexp ctx, sexp self, sexp fileno, sexp backlog) {
|
||||||
/* Additional utilities. */
|
/* Additional utilities. */
|
||||||
|
|
||||||
sexp sexp_sockaddr_name (sexp ctx, sexp self, struct sockaddr* addr) {
|
sexp sexp_sockaddr_name (sexp ctx, sexp self, struct sockaddr* addr) {
|
||||||
char buf[20];
|
char buf[24];
|
||||||
struct sockaddr_in *sa = (struct sockaddr_in *)addr;
|
/* struct sockaddr_in *sa = (struct sockaddr_in *)addr; */
|
||||||
unsigned char *ptr = (unsigned char *)&(sa->sin_addr);
|
/* unsigned char *ptr = (unsigned char *)&(sa->sin_addr); */
|
||||||
sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
|
/* sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]); */
|
||||||
|
inet_ntop(addr->sa_family,
|
||||||
|
(addr->sa_family == AF_INET6 ?
|
||||||
|
(void*)(&(((struct sockaddr_in6 *)addr)->sin6_addr)) :
|
||||||
|
(void*)(&(((struct sockaddr_in *)addr)->sin_addr))),
|
||||||
|
buf, 24);
|
||||||
return sexp_c_string(ctx, buf, -1);
|
return sexp_c_string(ctx, buf, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
|
|
||||||
|
(c-system-include "arpa/inet.h")
|
||||||
(c-system-include "sys/types.h")
|
(c-system-include "sys/types.h")
|
||||||
(c-system-include "sys/socket.h")
|
(c-system-include "sys/socket.h")
|
||||||
(c-system-include "netinet/in.h")
|
(c-system-include "netinet/in.h")
|
||||||
|
|
Loading…
Add table
Reference in a new issue