(asdf:load-system :usocket)
(asdf:load-system :bordeaux-threads)
(asdf:load-system :cffi)
(defconstant FD-SETSIZE 64)
(cffi:defcstruct timeval
(tv-sec :ulong)
(tv-usec :ulong))
(cffi:defcstruct fd-set
(fd-count :uint)
(fd-array :uint :count 64))
(cffi:defcfun ("select" win-select) :int
(nfds :int)
(readfds :pointer)
(writefds :pointer)
(exceptfds :pointer)
(timeout :pointer))
(defun fd-zero (set)
(setf (cffi:foreign-slot-value set 'fd-set 'fd-count) 0))
(defun fd-set (fd set)
(when (< (cffi:foreign-slot-value set 'fd-set 'fd-count) FD-SETSIZE)
(setf (cffi:mem-aref (cffi:foreign-slot-pointer set 'fd-set 'fd-array)
:uint
(cffi:foreign-slot-value set 'fd-set 'fd-count))
fd)
(incf (cffi:foreign-slot-value set 'fd-set 'fd-count))))
(defun fd-isset (fd set)
(cffi:foreign-funcall "__WSAFDIsSet" :uint fd ::pointer set :int))
(defun fd-clr (fd set)
(loop
:with count = (cffi:foreign-slot-value set 'fd-set 'fd-count)
:with i = 0
:while (< i count)
:if (= (cffi:mem-aref (cffi:foreign-slot-pointer set 'fd-set 'fd-array) :uint i) fd)
:do (loop :while (< i (1- count))
:do
(setf (cffi:mem-aref (cffi:foreign-slot-pointer set 'fd-set 'fd-array) :uint i)
(cffi:mem-aref (cffi:foreign-slot-pointer set 'fd-set 'fd-array) :uint (1+ i)))
(incf i))
(decf count)
:else
:do (incf i)
:finally (setf (cffi:foreign-slot-value set 'fd-set 'fd-count) count)))
(defun test ()
(let* ((listener (usocket:socket-listen "localhost" 8888 :reuse-address t))
(listener-fd (ccl:socket-os-fd (usocket:socket listener)))
(fds (list listener-fd))
(fd-obj `((,listener-fd ,listener))))
(format t "Listener Fd:~A~%" listener-fd)
(cffi:with-foreign-object (set 'fd-set)
(loop
(fd-zero set)
(dolist (fd fds) (fd-set fd set))
(unless (= 0 (win-select
(apply #'max fds)
set
(cffi:null-pointer) (cffi:null-pointer) (cffi:null-pointer)))
(dolist (fd fds)
(when (fd-isset fd set)
(if (= fd listener-fd)
(let* ((sock (usocket:socket-accept listener))
(sock-fd (ccl:socket-os-fd (usocket:socket sock))))
(format t "Accept~%")
(force-output t)
(push sock-fd fds)
(push (list sock-fd sock) fd-obj))
(progn
(format t "ReadLine:~A~%"
(read-line (usocket:socket-stream (second (assoc fd fd-obj)))))
(force-output t))))))))))
;; (defparameter th (bordeaux-threads:make-thread #'test))
;; (defparameter *con* (usocket:socket-connect "localhost" 8888))
;; (format (usocket:socket-stream *con*) "Hello, World~%")
;; (force-output (usocket:socket-stream *con*))
;; (bordeaux-threads:destroy-thread th)
2012年6月26日火曜日
[CL]Windowsでselect
CCL + CFFIでWindows上でselectしてみます。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿