Kimura Fuyuki
fuyuk****@nigre*****
2003年 10月 17日 (金) 13:05:05 JST
<sockaddr-in*>からアドレスやポートを取り出すためのメソッドが欲しかった ので、足してみました。 アドレス値の取り出し方については 1. string "127.0.0.1" 2. byte-string #*"\x7f\0\0\x01" 3. bignum #x7f000001 と3通りくらいは考えられるのですが、せっかくbignumがあるんだしというこ とで、とりあえず3にしておきました。 1の利点は、見てわかりやすいことです。欠点は、比較が面倒なことと(v4 は ともかく、v6アドレスの表記は一意ではない)、sockaddr-nameと機能的に重複 していて面白くないことです。 2は地味に無難かもしれません。でもなんか半端な気がします。 3の利点は比較が楽なことで、欠点は見てわかりにくいことです。 ほかの関数と挙動を揃えるなら、1にしておいたほうがいいでしょう。bignum 化するのは、このあいだ-develに出したGauche-ipaddrで一応可能です(作りか けですが)。 てな感じなのですが、どんなもんでしょうね。 -- 木村 冬樹 Index: ext/net/net.h =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/net.h,v retrieving revision 1.17 diff -u -r1.17 net.h --- ext/net/net.h 5 Jul 2003 03:29:10 -0000 1.17 +++ ext/net/net.h 17 Oct 2003 04:02:56 -0000 @@ -84,6 +84,8 @@ extern ScmGeneric Scm_GenericSockAddrName; extern ScmGeneric Scm_GenericSockAddrFamily; +extern ScmGeneric Scm_GenericSockAddrAddr; +extern ScmGeneric Scm_GenericSockAddrPort; typedef struct ScmSockAddrUnRec { SCM_HEADER; Index: ext/net/net.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/net.scm,v retrieving revision 1.23 diff -u -r1.23 net.scm --- ext/net/net.scm 1 Oct 2003 12:30:51 -0000 1.23 +++ ext/net/net.scm 17 Oct 2003 04:02:56 -0000 @@ -41,8 +41,8 @@ socket-address socket-status socket-input-port socket-output-port socket-shutdown socket-close socket-bind socket-connect socket-fd socket-listen socket-accept socket-setsockopt socket-getsockopt - <sockaddr> <sockaddr-in> <sockaddr-un> - sockaddr-name sockaddr-family make-sockaddrs + <sockaddr> <sockaddr-in> <sockaddr-un> make-sockaddrs + sockaddr-name sockaddr-family sockaddr-addr sockaddr-port make-client-socket make-server-socket make-server-sockets call-with-client-socket <sys-hostent> sys-gethostbyname sys-gethostbyaddr Index: ext/net/netlib.stub =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/netlib.stub,v retrieving revision 1.23 diff -u -r1.23 netlib.stub --- ext/net/netlib.stub 5 Jul 2003 03:29:10 -0000 1.23 +++ ext/net/netlib.stub 17 Oct 2003 04:02:56 -0000 @@ -47,6 +47,8 @@ (define-cgeneric sockaddr-name "Scm_GenericSockAddrName" (extern)) (define-cgeneric sockaddr-family "Scm_GenericSockAddrFamily" (extern)) +(define-cgeneric sockaddr-addr "Scm_GenericSockAddrAddr" (extern)) +(define-cgeneric sockaddr-port "Scm_GenericSockAddrPort" (extern)) (define-symbol unix "sym_unix") (define-symbol inet "sym_inet") @@ -81,6 +83,14 @@ (define-cmethod sockaddr-family ((addr "Scm_SockAddrInClass")) " SCM_RETURN(sym_inet);") +(define-cmethod sockaddr-addr ((addr "Scm_SockAddrInClass")) + " ScmSockAddrIn *a = (ScmSockAddrIn*)addr; + SCM_RETURN(Scm_MakeIntegerFromUI(ntohl(a->addr.sin_addr.s_addr)));") + +(define-cmethod sockaddr-port ((addr "Scm_SockAddrInClass")) + " ScmSockAddrIn *a = (ScmSockAddrIn*)addr; + SCM_RETURN(Scm_MakeInteger(ntohs(a->addr.sin_port)));") + (if "defined HAVE_IPV6" (begin (define-symbol inet6 "sym_inet6") @@ -97,6 +107,22 @@ (define-cmethod sockaddr-family ((addr "Scm_SockAddrIn6Class")) " SCM_RETURN(sym_inet6);") )) + +(define-cmethod sockaddr-addr ((addr "Scm_SockAddrIn6Class")) + " #define SIZE (16 / SIZEOF_LONG) + ScmSockAddrIn6 *a = (ScmSockAddrIn6*)addr; + u_long values[SIZE]; + u_long *p = (u_long*)a->addr.sin6_addr.s6_addr; + int i; + ScmObj bn; + + for (i = 0; i < SIZE; i++) values[SIZE-i-1] = ntohl(*p++); + bn = Scm_MakeBignumFromUIArray(1, values, SIZE); + SCM_RETURN(Scm_NormalizeBignum(SCM_BIGNUM(bn)));") + +(define-cmethod sockaddr-port ((addr "Scm_SockAddrIn6Class")) + " ScmSockAddrIn6 *a = (ScmSockAddrIn6*)addr; + SCM_RETURN(Scm_MakeInteger(ntohs(a->addr.sin6_port)));") ;;---------------------------------------------------------- ;; low-level socket routines Index: ext/net/test.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/test.scm,v retrieving revision 1.14 diff -u -r1.14 test.scm --- ext/net/test.scm 17 Aug 2003 02:36:53 -0000 1.14 +++ ext/net/test.scm 17 Oct 2003 04:02:56 -0000 @@ -50,6 +50,20 @@ (equal? (sockaddr-name addr) "255.255.255.255:0") #t)))) +(test "sockaddr_in" #t + (lambda () + (let ((addr (make <sockaddr-in> :host "127.0.0.1" :port 80))) + (and (= (sockaddr-addr addr) #x7f000001) + (= (sockaddr-port addr) 80) + #t)))) + +(test "sockaddr_in6" #t + (lambda () + (let ((addr (make <sockaddr-in6> :host "2001:200::8002:203:47ff:fea5:3085" :port 80))) + (and (= (sockaddr-addr addr) #x2001020000008002020347fffea53085) + (= (sockaddr-port addr) 80) + #t)))) + ;;----------------------------------------------------------------- (test-section "netdb")