From db06d84ee0c86f4da141e9688ca167b14510ca24 Mon Sep 17 00:00:00 2001 From: Takashi Kato Date: Fri, 12 Oct 2012 11:33:32 +0200 Subject: [PATCH] Removed *ai-passive* flag. Added constant variable explanations. Added references section. --- socket.sls | 5 +- srfi-socket.html | 498 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 341 insertions(+), 162 deletions(-) diff --git a/socket.sls b/socket.sls index b0e4b45..81b51b6 100644 --- a/socket.sls +++ b/socket.sls @@ -6,7 +6,7 @@ socket-accept socket-send socket-recv socket-shutdown socket-close *af-unspec* *af-inet* *af-inet6* *sock-stream* *sock-dgram* - *ai-passive* *ai-canoname* *ai-numerichost* + *ai-canoname* *ai-numerichost* *ai-v4mapped* *ai-all* *ai-addrconfig* *ipproto-ip* *ipproto-tcp* *ipproto-udp* *shut-rd* *shut-wr* *shut-rdwr* @@ -17,8 +17,7 @@ (define %address-family `((inet ,*af-inet*) (inet6 ,*af-inet6*) (unspec ,*af-unspec*))) - (define %address-info `((passive ,*ai-passive*) - (canoname ,*ai-canoname*) + (define %address-info `((canoname ,*ai-canoname*) (numerichost ,*ai-numerichost*) (v4mapped ,*ai-v4mapped*) (all ,*ai-all*) diff --git a/srfi-socket.html b/srfi-socket.html index c9d95ba..e1b80e5 100644 --- a/srfi-socket.html +++ b/srfi-socket.html @@ -114,18 +114,13 @@

Specification

-
Abstraction layer for flags
+
Flag operations
-      address-info address-family
+      address-family address-info 
       socket-domain ip-protocol
       shutdown-method
-    
-
-
Flag operations
-
-
       socket-merge-flags
       socket-parge-flags
     
@@ -136,7 +131,7 @@

Specification

       *af-unspec* *af-inet* *af-inet6*
       *sock-stream* *sock-dgram*
-      *ai-passive* *ai-canoname* *ai-numerichost*
+      *ai-canoname* *ai-numerichost*
       *ai-v4mapped* *ai-all* *ai-addrconfig*
       *ipproto-ip* *ipproto-tcp* *ipproto-udp*
       *shut-rd* *shut-wr* *shut-rdwr*
@@ -330,6 +325,103 @@ 

Control feature

Flag operations

+
+ address-family + name -> address-family +
+
+ Returns proper address family from given name.
+ Implementation must support at least following names and must have the + described behaviour. +
+
inet
+
Returns *af-inet*
+
inet6
+
Returns *af-inet6*
+
unspec
+
Returns *af-unspec*
+
+ Implementation may support more names such as unix or + local or other names. +
+ +
+ address-info + names ... -> address-info +
+
+ Returns merged address info flags from given names.
+ Implementation must support at least following names and must have the + described behaviour. +
+
canoname
+
Returns *ai-canoname*
+
numerichost
+
Returns *ai-numerichost*
+
v4mapped
+
Returns *ai-v4mapped*
+
all
+
Returns *ai-all*
+
addrconfig
+
Returns *ai-addrconfig*
+
+ Implementation may support more names. +
+ +
+ socket-domain + name -> socket-domain +
+
+ Returns socket domain flags from given name.
+ Implementation must support at least following names and must have the + described behaviour. +
+
stream
+
Returns *sock-stream*
+
datagram
+
Returns *sock-dgram*
+
+ Implementation may support more names. +
+ +
+ ip-protocol + name -> ip-protocol +
+
+ Returns ip-protocol flag from given name.
+ Implementation must support at least following names and must have the + described behaviour. +
+
ip
+
Returns *ipproto-ip*
+
tcp
+
Returns *ipproto-tcp*
+
udp
+
Returns *ipproto-udp*
+
+ Implementation may support more names. +
+ +
+ shutdown-method + names ... -> shutdown-method +
+
+ Returns shutdown method flags from given names.
+ Implementation must support at least following names and must have the + described behaviour. +
+
read
+
Returns *shut-rd*
+
write
+
Returns *shut-wr*
+
+ If shutdown-method is given both read and + write, then it must return *shut-rdwr* +
+
socket-merge-flags flags ... -> new-flags @@ -349,26 +441,102 @@

Flag operations

Constants

-The following variable should be defined but it highly depends on the platform. - +Implementation must support following constant variables.
+All constant variable must be consistent with POSIX's[1] definition. +

Address family

+
+
*af-inet*
+
+ Internet domain sockets for use with IPv4 addresses.
+ This must behave the same as POSIX's AF_INET. +
+
*af-inet6*
+
+ Internet domain sockets for use with IPv6 addresses.
+ This must behave the same as POSIX's AF_INET6. +
+
*af-unspec*
+
+ Unspecified.
+ This must behave the same as POSIX's AF_UNSPEC. +
+
+ +

Socket domain

+
+
*sock-stream*
+
+ Byte-stream socket.
+ This must behave the same as POSIX's SOCK_STREAM. +
+
*sock-dgram*
+
+ Datagram socket.
+ This must behave the same as POSIX's SOCK_DGRAM. +
+
+ +

Address info

+
+
*ai-canoname*
+
+ This must behave the same as POSIX's AI_CANONNAME. +
+
*ai-numerichost*
+
+ This must behave the same as POSIX's AI_NUMERICHOST. +
+
*ai-v4mapped*
+
+ This must behave the same as POSIX's AI_V4MAPPED. +
+
*ai-all*
+
+ This must behave the same as POSIX's AI_ALL. +
+
*ai-addrconfig*
+
+ This must behave the same as POSIX's AI_ADDRCONFIG. +
+
+ +

IP protocol

+
+
*ipproto-ip*
+
+ Internet protocol.
+ This must behave the same as POSIX's IPPROTO_IP. +
+
*ipproto-tcp*
+
+ Transmission control protocol.
+ This must behave the same as POSIX's IPPROTO_TCP. +
+
*ipproto-udp*
+
+ User datagram protocol.
+ This must behave the same as POSIX's IPPROTO_UDP. +
+
+ +

Shutdown method

+
+
*shut-rd*
+
+ Disables further receive operation.
+ This must behave the same as POSIX's SHUT_RD. +
+
*shut-wr*
+
+ Disables further send operations.
+ This must behave the same as POSIX's SHUT_WR. +
+
*shut-rdwr*
+
+ Disables further send and receive operations.
+ This must behave the same as POSIX's SHUT_RDWR. +
+

Conditions

@@ -387,7 +555,8 @@

Conditions

Example

-(import (rnrs) (socket))
+;; simple echo server
+(import (rnrs) (srfi :106 socket))
 
 (define echo-server-socket (make-server-socket "5000"))
 
@@ -413,6 +582,16 @@ 

Example

(put-bytevector p (string->utf8 (string-append r "\r\n")) (lp2 (get-line-from-binary-port p)))))))))) (server-run) + +;; simple echo client +(import (rnrs) (srfi :106 socket)) +(define client-socket (make-client-socket "localhost" "5000" + (address-family inet) + (socket-domain stream) + (address-info v4mapped addrconfig) + (ip-protocol ip))) +(socket-send client-socket (string-<utf8 "hello\r\n")) +(socket-recv client-socket (string-length "hello\r\n"))

Implementation

@@ -422,39 +601,38 @@

Interface layer

 (library (srfi :106 socket)
     (export make-client-socket make-server-socket
-	    socket? socket-port call-with-socket
-	    socket-merge-flags socket-parge-flags
-	    socket-accept socket-send socket-recv socket-shutdown socket-close
-	    *af-unspec* *af-inet* *af-inet6*
-	    *sock-stream* *sock-dgram*
-	    *ai-passive* *ai-canoname* *ai-numerichost*
-	    *ai-v4mapped* *ai-all* *ai-addrconfig*
-	    *ipproto-ip* *ipproto-tcp* *ipproto-udp*
-	    *shut-rd* *shut-wr* *shut-rdwr*
-	    address-family socket-domain address-info
-	    ip-protocol shutdown-method)
+            socket? socket-port call-with-socket
+            socket-merge-flags socket-parge-flags
+            socket-accept socket-send socket-recv socket-shutdown socket-close
+            *af-unspec* *af-inet* *af-inet6*
+            *sock-stream* *sock-dgram*
+            *ai-canoname* *ai-numerichost*
+            *ai-v4mapped* *ai-all* *ai-addrconfig*
+            *ipproto-ip* *ipproto-tcp* *ipproto-udp*
+            *shut-rd* *shut-wr* *shut-rdwr*
+            address-family socket-domain address-info
+            ip-protocol shutdown-method)
     (import (rnrs) (srfi :106 socket impl))
 
   (define %address-family `((inet    ,*af-inet*)
-			    (inet6   ,*af-inet6*)
-			    (unspec  ,*af-unspec*)))
-  (define %address-info `((passive   	,*ai-passive*)
-			  (canoname  	,*ai-canoname*)
-			  (numerichost  ,*ai-numerichost*)
-			  (v4mapped     ,*ai-v4mapped*)
-			  (all          ,*ai-all*)
-			  (addrconfig   ,*ai-addrconfig*)))
+                            (inet6   ,*af-inet6*)
+                            (unspec  ,*af-unspec*)))
+  (define %address-info `((canoname     ,*ai-canoname*)
+                          (numerichost  ,*ai-numerichost*)
+                          (v4mapped     ,*ai-v4mapped*)
+                          (all          ,*ai-all*)
+                          (addrconfig   ,*ai-addrconfig*)))
 
   (define %ip-protocol `((ip  ,*ipproto-ip*)
-			 (tcp ,*ipproto-tcp*)
-			 (udp ,*ipproto-udp*)))
+                         (tcp ,*ipproto-tcp*)
+                         (udp ,*ipproto-udp*)))
 
   (define %socket-domain `((stream   ,*sock-stream*)
-			   (datagram ,*sock-dgram*)))
+                           (datagram ,*sock-dgram*)))
 
   (define (lookup who sets name)
     (cond ((assq name sets) => cadr)
-	  (else (assertion-violation who "no name defined" name))))
+          (else (assertion-violation who "no name defined" name))))
 
   (define-syntax address-family
     (syntax-rules ()
@@ -465,8 +643,8 @@ 

Interface layer

(syntax-rules () ((_ names ...) (apply socket-merge-flags - (map (lambda (name) (lookup 'address-info %address-info name)) - '(names ...)))))) + (map (lambda (name) (lookup 'address-info %address-info name)) + '(names ...)))))) (define-syntax socket-domain (syntax-rules () @@ -482,21 +660,21 @@

Interface layer

(define allowed-methods '(read write)) (define (check-methods methods) (let loop ((methods methods) (seen '())) - (cond ((null? methods)) - ((memq (car methods) allowed-methods) - => (lambda (m) - (if (memq (car m) seen) - (assertion-violation 'shutdown-method - "duplicate method" m) - (loop (cdr methods) (cons (car m) seen))))) - (else (assertion-violation 'shutdown-method - "unknown method" (car methods)))))) + (cond ((null? methods)) + ((memq (car methods) allowed-methods) + => (lambda (m) + (if (memq (car m) seen) + (assertion-violation 'shutdown-method + "duplicate method" m) + (loop (cdr methods) (cons (car m) seen))))) + (else (assertion-violation 'shutdown-method + "unknown method" (car methods)))))) (check-methods methods) (if (null? (cdr methods)) - (case (car methods) - ((read) *shut-rd*) - ((write) *shut-wr*)) - *shut-rdwr*)) + (case (car methods) + ((read) *shut-rd*) + ((write) *shut-wr*)) + *shut-rdwr*)) (define-syntax shutdown-method (syntax-rules () @@ -512,30 +690,29 @@

For Ypsilon

 (library (srfi :106 socket impl)
     (export make-client-socket make-server-socket
-	    socket? socket-port call-with-socket
+            socket? socket-port call-with-socket
             (rename (bitwise-ior socket-merge-flags)
                     (bitwise-xor socket-parge-flags))
-	    socket-accept socket-send socket-recv socket-shutdown socket-close
-	    (rename (AF_UNSPEC *af-unspec*)
-		    (AF_INET   *af-inet*)
-		    (AF_INET6  *af-inet6*))
-	    (rename (SOCK_STREAM *sock-stream*)
-		    (SOCK_DGRAM  *sock-dgram*))
-	    (rename (AI_PASSIVE     *ai-passive*)
-		    (AI_CANONNAME   *ai-canoname*)
-		    (AI_NUMERICHOST *ai-numerichost*)
-		    (AI_V4MAPPED    *ai-v4mapped*)
-		    (AI_ALL         *ai-all*)
-		    (AI_ADDRCONFIG  *ai-addrconfig*))
+            socket-accept socket-send socket-recv socket-shutdown socket-close
+            (rename (AF_UNSPEC *af-unspec*)
+                    (AF_INET   *af-inet*)
+                    (AF_INET6  *af-inet6*))
+            (rename (SOCK_STREAM *sock-stream*)
+                    (SOCK_DGRAM  *sock-dgram*))
+            (rename (AI_CANONNAME   *ai-canoname*)
+                    (AI_NUMERICHOST *ai-numerichost*)
+                    (AI_V4MAPPED    *ai-v4mapped*)
+                    (AI_ALL         *ai-all*)
+                    (AI_ADDRCONFIG  *ai-addrconfig*))
             (rename (IPPROTO_IP  *ipproto-ip*)
-		    (IPPROTO_TCP *ipproto-tcp*)
-		    (IPPROTO_UDP *ipproto-udp*))
-	    (rename (SHUT_RD   *shut-rd*)
-		    (SHUT_WR   *shut-wr*)
-		    (SHUT_RDWR *shut-rdwr*)))
+                    (IPPROTO_TCP *ipproto-tcp*)
+                    (IPPROTO_UDP *ipproto-udp*))
+            (rename (SHUT_RD   *shut-rd*)
+                    (SHUT_WR   *shut-wr*)
+                    (SHUT_RDWR *shut-rdwr*)))
     (import (rnrs) (rename (ypsilon socket)
-			   (socket-send %socket-send)	
-			   (socket-recv %socket-recv)))
+                           (socket-send %socket-send)        
+                           (socket-recv %socket-recv)))
 
   (define IPPROTO_IP 0)
   (define IPPROTO_TCP 6)
@@ -555,27 +732,26 @@ 

For Mosh

 (library (srfi :106 socket impl)
     (export make-client-socket make-server-socket
-	    socket? socket-port call-with-socket
+            socket? socket-port call-with-socket
             (rename (bitwise-ior socket-merge-flags)
                     (bitwise-xor socket-parge-flags))
-	    socket-accept socket-send socket-recv socket-shutdown socket-close
-	    (rename (AF_UNSPEC *af-unspec*)
-		    (AF_INET   *af-inet*)
-		    (AF_INET6  *af-inet6*))
-	    (rename (SOCK_STREAM *sock-stream*)
-		    (SOCK_DGRAM  *sock-dgram*))
-	    (rename (AI_PASSIVE     *ai-passive*)
-		    (AI_CANONNAME   *ai-canoname*)
-		    (AI_NUMERICHOST *ai-numerichost*)
-		    (AI_V4MAPPED    *ai-v4mapped*)
-		    (AI_ALL         *ai-all*)
-		    (AI_ADDRCONFIG  *ai-addrconfig*))
+            socket-accept socket-send socket-recv socket-shutdown socket-close
+            (rename (AF_UNSPEC *af-unspec*)
+                    (AF_INET   *af-inet*)
+                    (AF_INET6  *af-inet6*))
+            (rename (SOCK_STREAM *sock-stream*)
+                    (SOCK_DGRAM  *sock-dgram*))
+            (rename (AI_CANONNAME   *ai-canoname*)
+                    (AI_NUMERICHOST *ai-numerichost*)
+                    (AI_V4MAPPED    *ai-v4mapped*)
+                    (AI_ALL         *ai-all*)
+                    (AI_ADDRCONFIG  *ai-addrconfig*))
             (rename (IPPROTO_IP  *ipproto-ip*)
-		    (IPPROTO_TCP *ipproto-tcp*)
-		    (IPPROTO_UDP *ipproto-udp*))
-	    (rename (SHUT_RD   *shut-rd*)
-		    (SHUT_WR   *shut-wr*)
-		    (SHUT_RDWR *shut-rdwr*)))
+                    (IPPROTO_TCP *ipproto-tcp*)
+                    (IPPROTO_UDP *ipproto-udp*))
+            (rename (SHUT_RD   *shut-rd*)
+                    (SHUT_WR   *shut-wr*)
+                    (SHUT_RDWR *shut-rdwr*)))
     (import (rnrs) (mosh socket))
   (define IPPROTO_IP 0)
   )
@@ -585,30 +761,29 @@ 

For Sagittarius

 (library (srfi :106 socket impl)
     (export make-client-socket make-server-socket
-	    socket? socket-port call-with-socket
+            socket? socket-port call-with-socket
             (rename (bitwise-ior socket-merge-flags)
                     (bitwise-xor socket-parge-flags))
-	    socket-accept socket-send socket-recv socket-shutdown socket-close
-	    (rename (AF_UNSPEC *af-unspec*)
-		    (AF_INET   *af-inet*)
-		    (AF_INET6  *af-inet6*))
-	    (rename (SOCK_STREAM *sock-stream*)
-		    (SOCK_DGRAM  *sock-dgram*))
-	    (rename (AI_PASSIVE     *ai-passive*)
-		    (AI_CANONNAME   *ai-canoname*)
-		    (AI_NUMERICHOST *ai-numerichost*)
-		    (AI_V4MAPPED    *ai-v4mapped*)
-		    (AI_ALL         *ai-all*)
-		    (AI_ADDRCONFIG  *ai-addrconfig*))
+            socket-accept socket-send socket-recv socket-shutdown socket-close
+            (rename (AF_UNSPEC *af-unspec*)
+                    (AF_INET   *af-inet*)
+                    (AF_INET6  *af-inet6*))
+            (rename (SOCK_STREAM *sock-stream*)
+                    (SOCK_DGRAM  *sock-dgram*))
+            (rename (AI_CANONNAME   *ai-canoname*)
+                    (AI_NUMERICHOST *ai-numerichost*)
+                    (AI_V4MAPPED    *ai-v4mapped*)
+                    (AI_ALL         *ai-all*)
+                    (AI_ADDRCONFIG  *ai-addrconfig*))
             (rename (IPPROTO_IP  *ipproto-ip*)
-		    (IPPROTO_TCP *ipproto-tcp*)
-		    (IPPROTO_UDP *ipproto-udp*))
-	    (rename (SHUT_RD   *shut-rd*)
-		    (SHUT_WR   *shut-wr*)
-		    (SHUT_RDWR *shut-rdwr*)))
+                    (IPPROTO_TCP *ipproto-tcp*)
+                    (IPPROTO_UDP *ipproto-udp*))
+            (rename (SHUT_RD   *shut-rd*)
+                    (SHUT_WR   *shut-wr*)
+                    (SHUT_RDWR *shut-rdwr*)))
     (import (rnrs) (rename (sagittarius socket)
-			   (socket-send %socket-send)
-			   (socket-recv %socket-recv)))
+                           (socket-send %socket-send)
+                           (socket-recv %socket-recv)))
 
   (define IPPROTO_IP  0)
   (define IPPROTO_TCP 6)
@@ -626,60 +801,58 @@ 

For others

 (library (srfi :106 socket impl)
     (export make-client-socket make-server-socket
-	    socket? socket-port call-with-socket
-	    socket-accept socket-send socket-recv socket-shutdown socket-close
-	    (rename (AF_UNSPEC *af-unspec*)
-		    (AF_INET   *af-inet*)
-		    (AF_INET6  *af-inet6*))
-	    (rename (SOCK_STREAM *sock-stream*)
-		    (SOCK_DGRAM  *sock-dgram*))
-	    (rename (AI_PASSIVE     *ai-passive*)
-		    (AI_CANONNAME   *ai-canoname*)
-		    (AI_NUMERICHOST *ai-numerichost*)
-		    (AI_V4MAPPED    *ai-v4mapped*)
-		    (AI_ALL         *ai-all*)
-		    (AI_ADDRCONFIG  *ai-addrconfig*))
+            socket? socket-port call-with-socket
+            socket-accept socket-send socket-recv socket-shutdown socket-close
+            (rename (AF_UNSPEC *af-unspec*)
+                    (AF_INET   *af-inet*)
+                    (AF_INET6  *af-inet6*))
+            (rename (SOCK_STREAM *sock-stream*)
+                    (SOCK_DGRAM  *sock-dgram*))
+            (rename (AI_CANONNAME   *ai-canoname*)
+                    (AI_NUMERICHOST *ai-numerichost*)
+                    (AI_V4MAPPED    *ai-v4mapped*)
+                    (AI_ALL         *ai-all*)
+                    (AI_ADDRCONFIG  *ai-addrconfig*))
             (rename (IPPROTO_IP  *ipproto-ip*)
-		    (IPPROTO_TCP *ipproto-tcp*)
-		    (IPPROTO_UDP *ipproto-udp*))
-	    (rename (SHUT_RD   *shut-rd*)
-		    (SHUT_WR   *shut-wr*)
-		    (SHUT_RDWR *shut-rdwr*)))
+                    (IPPROTO_TCP *ipproto-tcp*)
+                    (IPPROTO_UDP *ipproto-udp*))
+            (rename (SHUT_RD   *shut-rd*)
+                    (SHUT_WR   *shut-wr*)
+                    (SHUT_RDWR *shut-rdwr*)))
     (import (rnrs))
 
   (define-syntax define-unsupported
     (syntax-rules ()
       ((_ (name))
        (define (name . _)
-	 (raise 
-	  (condition (make-implementation-restriction-violation)
-		     (make-who-condition 'name)
-		     (make-message-condition
-		      "This SRFI is not supported on this implementation")))))
+         (raise 
+          (condition (make-implementation-restriction-violation)
+                     (make-who-condition 'name)
+                     (make-message-condition
+                      "This SRFI is not supported on this implementation")))))
       ((_ name)
        (define name #f))))
 
   (define-unsupported (make-client-socket))
   (define-unsupported (make-server-socket))
-  (define-unsupported (socket?		 ))
-  (define-unsupported (socket-port	 ))
-  (define-unsupported (call-with-socket	 ))
-  (define-unsupported (socket-accept	 ))
-  (define-unsupported (socket-send	 ))
-  (define-unsupported (socket-recv	 ))
-  (define-unsupported (socket-shutdown	 ))
+  (define-unsupported (socket?           ))
+  (define-unsupported (socket-port       ))
+  (define-unsupported (call-with-socket  ))
+  (define-unsupported (socket-accept     ))
+  (define-unsupported (socket-send       ))
+  (define-unsupported (socket-recv       ))
+  (define-unsupported (socket-shutdown   ))
   (define-unsupported (socket-close      ))
 
   (define-unsupported AF_UNSPEC     )
-  (define-unsupported AF_INET	    )
-  (define-unsupported AF_INET6	    )
+  (define-unsupported AF_INET       )
+  (define-unsupported AF_INET6      )
   (define-unsupported SOCK_STREAM   )
   (define-unsupported SOCK_DGRAM    )
-  (define-unsupported AI_PASSIVE    )
   (define-unsupported AI_CANONNAME  )
   (define-unsupported AI_NUMERICHOST)
   (define-unsupported AI_V4MAPPED   )
-  (define-unsupported AI_ALL	    )
+  (define-unsupported AI_ALL        )
   (define-unsupported AI_ADDRCONFIG )
 
   (define-unsupported IPPROTO_IP)
@@ -692,6 +865,13 @@ 

For others

)
+

References

+ +
+[1] The Open Group Base Specifications Issue 7
+    http://pubs.opengroup.org/onlinepubs/9699919799/nframe.html
+
+

Copyright

Copyright (C) Takashi Kato (2012). All Rights Reserved.