anchor.diff:  		"SERVER-SOCKET"
   		"ACCEPT-SOCKET"
   		"CLOSE-SOCKET"
  +                        "RECEIVE-FROM"
  +                        "SEND-TO"
   		"WRITE-SOCKET-LINE"
   		"DO-FFI-READ-SOCKET"
   		"DO-FFI-WRITE-SOCKET"
  
positive.code: 						(when (or (= result SOCKET_ERROR) (= result 0))
  							(return)))))
  			(closesocket descriptor)
  			(setf (socket-descriptor s) nil))))
  
  (defgeneric do-ffi-write-socket (s buffer length)
  	(:documentation
  
negative.code: ;;; In a protocol-independent approach, it is more convenient to use the ADDR instead of the ipaddr proper.
  ;;; We define the functions host-to-ipaddr, ipaddr-to-dotted and ipaddr-to-dotted with this in mind.
  
  (defun host-to-ipaddr (dotted-or-name &key port (ipv6 *ipv6*) all) "Return the ipaddr (addr) given a host name, a dotted IP address or an addr.
  Port: symbol, string or integer. IPv6: nil, :only or t.
  All: If it is nil, return the first address available otherwise return the list of all addresses."
      (let ((res (if (stringp dotted-or-name)
                        (get-addr-info dotted-or-name :port (or port 0) :host-is-name :unspec :ipv6 ipv6 :errorp t)
                        (list dotted-or-name))))
          (if all res (car res))))
  
  (defun ipaddr-to-name (addr) "Given an ipaddr (addr), lookup the host name."
      (get-name-info addr :errorp t))
  
  (defun ipaddr-to-dotted (addr) "Given an ipaddr (addr), return the dotted name."
      (or (getf addr :dotted) (get-name-info addr :dottedp t :errorp t)))
  
  (defclass base-socket ()
  