Helmut Eller schrieb:
For example with:
(read-char-no-hang (let ((socket (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp))) (setf (sb-bsd-sockets:sockopt-reuse-address socket) t) (sb-bsd-sockets:socket-bind socket #(0 0 0 0) 5000) (sb-bsd-sockets:socket-listen socket 5) (unwind-protect (sb-bsd-sockets:socket-make-stream (sb-bsd-sockets:socket-accept socket) :output t :input t :element-type 'character) (sb-bsd-sockets:socket-close socket))))
This creates a socket, waits for someone to connect, and calls read-char-no-hang on the new stream. Start this in SBCL and execute "telnet localhost 5000" in a shell. read-char-no-hang should return nil as soon as the telnet client connects.
If it just waits, then you can type something into the telnet window and the first char should appear on the SBCL side. In this case read-char-no-hang doesn't work properly, it works like the ordinary read-char.
You're right, it does not return nil as soon as someone connects. It does however return the first char as soon as I type something into the first window.
The best solution would be to fix HANDLE-LISTEN, but I don't know how to do that.
As a workaround you can probably replace (wait-for-event `(:sldb-return ,(1+ level)) t) ; clean event-queue in sldb-loop with: (poll-for-event `(:sldb-return ,(1+ level))
That actually solved the problem! Now given that the problem seems to be with sbcl's HANDLE-LISTEN, I guess I'll check out their mailing list.
Many thanks there, Thomas K.