[Gauche-devel-jp] sockaddr-(addr|port)

Back to archive index

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")
 



Gauche-devel-jp メーリングリストの案内
Back to archive index