I think the socket-connect function in the SBCL backend
is incorrectly calling bind when creating a client stream
socket.
With the current code, when I create a lot of client stream
sockets on a Linux system, the bind call in socket-connect
eventually returns an error, address already in use. I don't
think the bind call is needed for the client end of stream
sockets.
The following patch appears to fix the problem for me.
bob
--- backend/sbcl.lisp.~1~ 2011-09-23 13:46:55.071765010 -0400
+++ backend/sbcl.lisp 2011-09-23 13:51:33.841811680 -0400
@@ -269,9 +269,8 @@
:protocol (case protocol
(:stream :tcp)
(:datagram :udp))))
- (local-host (host-to-vector-quad (or local-host *wildcard-host*)))
- (local-port (or local-port *auto-port*))
- usocket ok)
+ (usocket nil)
+ (ok nil))
(unwind-protect
(progn
(ecase protocol
@@ -284,8 +283,6 @@
;; to pass compilation on ECL without it.
(when (and nodelay-specified sockopt-tcp-nodelay-p)
(setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) nodelay))
- (when (or local-host local-port)
- (sb-bsd-sockets:socket-bind socket local-host local-port))
(with-mapped-conditions (usocket)
#+(and sbcl (not win32))
(labels ((connect ()