(defpackage "SB-BSD-SOCKETS-INTERNAL" (:nicknames "SOCKINT") (:shadow close listen) #+cmu (:shadowing-import-from "CL" with-array-data) #+sbcl (:shadowing-import-from "SB-KERNEL" with-array-data) #+cmu (:use "COMMON-LISP" "ALIEN" "SYSTEM" "EXT" "C-CALL") #+sbcl (:use "COMMON-LISP" "SB-ALIEN" #+nil "SB-SYSTEM" "SB-EXT" "SB-C-CALL")) ;;; SBCL changes a lot of package prefixes. To avoid littering the ;;; code with conditionals, we use the SBCL package prefixes ;;; throughout. This means that we need to create said packages ;;; first, if we're using CMUCL ;;; One thing that this exercise really has made clear is just how much ;;; of the alien stuff is scattered around the cmucl package space ;;; seemingly at random. Hmm. #+cmu (eval-when (:compile-toplevel :load-toplevel) (defun add-package-nickname (name nickname) (let ((p (find-package name))) (rename-package p (package-name p) (cons nickname (package-nicknames name))))) (add-package-nickname "EXT" "SB-EXT") (add-package-nickname "ALIEN" "SB-ALIEN") (add-package-nickname "UNIX" "SB-UNIX") (add-package-nickname "C-CALL" "SB-C-CALL") (add-package-nickname "KERNEL" "SB-KERNEL") (add-package-nickname "SYSTEM" "SB-SYS")) (defpackage "SB-BSD-SOCKETS" (:export socket local-socket inet-socket make-local-socket make-inet-socket socket-bind socket-accept socket-connect socket-send socket-receive socket-recv socket-name socket-peername socket-listen socket-close socket-file-descriptor socket-family socket-protocol socket-type socket-make-stream get-protocol-by-name get-host-by-name get-host-by-address host-ent host-ent-addresses host-ent-address host-ent-aliases host-ent-name name-service-error ;; not sure if these are really good names or not netdb-internal-error netdb-success-error host-not-found-error try-again-error no-recovery-error ;; all socket options are also exported, by code in ;; sockopt.lisp socket-error ;; other errno-based socket errors are exported by code in ;; sockets.lisp make-inet-address non-blocking-mode ) (:use "COMMON-LISP" "SB-BSD-SOCKETS-INTERNAL") (:import-from "SB-INT" "UNSUPPORTED-OPERATOR" "FEATUREP") (:documentation " A thinly-disguised BSD socket API for SBCL. Ideas stolen from the BSD socket API for C and Graham Barr's IO::Socket classes for Perl. We represent sockets as CLOS objects, and rename a lot of methods and arguments to fit Lisp style more closely. " )) #||

Contents

  1. General concepts
  2. Methods applicable to all sockets
  3. Socket Options
  4. Methods applicable to a particular subclass
    1. INET-SOCKET - Internet Protocol (TCP, UDP, raw) sockets
    2. Methods on LOCAL-SOCKET - Local-domain sockets
  5. Name resolution (DNS, /etc/hosts, &c)

General concepts

Most of the functions are modelled on the BSD socket API. BSD sockets are widely supported, portably ("portable" by Unix standards, at least) available on a variety of systems, and documented. There are some differences in approach where we have taken advantage of some of the more useful features of Common Lisp - briefly

|# (in-package :sb-bsd-sockets) (defmethod asdf:hyperdocumentation ((package (eql #.*package*)) symbol kind) (declare (ignore kind)) (format nil "file://~A#~A" #.(namestring (merge-pathnames "index.html" (or *load-pathname* *compile-file-pathname*))) symbol))