[common lisp] - использованиe read на сокетах
От: Аноним  
Дата: 27.05.10 19:25
Оценка:
Linux, sbcl 1.0.38


Сервер:
(let ((socket (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp))
(sb-bsd-sockets:bind socket ...)
(sb-bsd-sockets:listen socket ...)
(let* ((client-socket (sb-bsd-sockets:socket-accept socket))
(socket-stream (sb-bsd-sockets:socket-make-stream client-socket :input t :output t)))
(format t "client connected~%")
(format t "data:~a~%" (read socket-stream))))

Все отлично работает — сокет создается, клиент удачно подключается. Но вот как работает функция (read socket-stream) я понять совсем не могу. Oна не возвращает управление. Она вроде должна читать s-expressions которые приходят по сети. Возвращает управление только тогда, когда на другом конце сделать socket-close. Тогда вернет то, что передали.
Я пробовал передавать #\return и #\newline, тогда оно возвращает управление через раз (еще не увидел закономерности) и я совсем не могу понять что нужно передать ей по сети чтоб все работало нормально. Можно использовать socket-receive, которая не возвращает то, что пришло, но это слишком грубо.



Пример клиента:
(let ((socket-stream (sb-bsd-sockets:socket-make-stream socket :input t :output t))) ;; Опустим процесс подключения для простоты
(format socket-stream "~a" 'some-symbol))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.