标签: usocket

通过LISP USOCKET接收数据

我正在尝试通过USOCKET发送数据.当数据到达服务器时,服务器应该回复.但是,stream-read(如下定义)仅在数据与其发送的原始数据一起回显时返回数据.例如,如果我发送hello并且服务器回复相同的数据,hellostream-read返回,但如果服务器回复hi,stream-read则在服务器发送它收到的确切缓冲区之前不会返回.

这是代码:(我在网上找到了大部分代码.)

;; Load USocket
(load #P"/usr/share/common-lisp/source/cl-asdf/asdf.lisp")      
(asdf:operate 'asdf:load-op :usocket)

(defun stream-read (stream)
  (socket-listen (usocket:socket-stream stream)))

(defun stream-print (string stream)
  (write-line string (usocket:socket-stream stream))
  (force-output (usocket:socket-stream stream)))

;; Define a stream
(defparameter my-stream
  (usocket:socket-connect "127.0.0.1" 6003))

;; Use the stream
(stream-print "random" my-stream)
(print (stream-read my-stream))
Run Code Online (Sandbox Code Playgroud)

至于服务器,我使用了一个略微修改版本的boost阻塞服务器示例.(c ++)完整的代码可以在这里找到:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_server.cpp

...

void session(socket_ptr sock)
{
   try
   {    
    for (;;)
    {
      char data[max_length];

      boost::system::error_code error;
      size_t …
Run Code Online (Sandbox Code Playgroud)

sockets networking tcp common-lisp usocket

5
推荐指数
1
解决办法
1741
查看次数

Common Lisp中的WebSocket客户端与usocket库

我正在尝试升级协议,从HTTP 1.1切换到WebSockets.我试过用usocket.到目前为止我的代码如下(并作为GitHub要点提供).握手读取后,函数返回NILunexpected EOF错误.

;; Define parameter sock for usocket stream
;; echo.websocket.org is a site for testing websockets
(defparameter sock (usocket:socket-connect "echo.websocket.org" 80))

;; Output confirms WebSocket protocol handshake as this implemented in browsers 
(format (usocket:socket-stream sock) "~A~%~A~%~A~%~A~%~A~A~%~A~%~A~%~%" 
        "GET /?encoding=text HTTP/1.1"
        "Connection: Upgrade"
        "Host: echo.websocket.org"
        "Origin: http://www.websocket.org"
        "Sec-WebSocket-Key: " (generate-websocket-key)
        "Sec-WebSocket-Version: 13"
        "Upgrade: websocket")

;; Write output to stream
(force-output (usocket:socket-stream sock))

;; Returns NIL
(do ((line                                                             
      (read-line (usocket:socket-stream sock) nil)                        
      (read-line …
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp websocket usocket

3
推荐指数
1
解决办法
701
查看次数

这个 Common Lisp 示例中 socket-close 的目的是什么?

我从 Common Lisp Cookbook 中找到了这个例子,它展示了如何使用 usocket 启动 TCP 服务器。

该示例创建一个套接字对象并建立连接,然后写入套接字。万一出现错误,套接字写入被包裹在一个 unwind-protect 中,它将关闭套接字以便它可以被重用。我已经重写了导致错误的示例,但是当我多次运行它时,我得到一个USOCKET:ADDRESS-IN-USE-ERROR. 如果我删除socket-close函数调用,行为是相同的。

(load "~/quicklisp/setup.lisp")
(ql:quickload "usocket")

(let* ((socket (usocket:socket-listen "localhost" 8080))
       (connection (usocket:socket-accept socket)))
        (unwind-protect
          (progn
            (error "error 1"))
          (progn
            (usocket:socket-close connection)
            (usocket:socket-close socket)
            (print "Error clean up"))))
Run Code Online (Sandbox Code Playgroud)
Unhandled USOCKET:ADDRESS-IN-USE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                                    {10005E85B3}>:
  Condition USOCKET:ADDRESS-IN-USE-ERROR was signalled.

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005E85B3}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<USOCKET:ADDRESS-IN-USE-ERROR {1003FDC063}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<USOCKET:ADDRESS-IN-USE-ERROR {1003FDC063}>)
2: (INVOKE-DEBUGGER …
Run Code Online (Sandbox Code Playgroud)

common-lisp usocket

1
推荐指数
1
解决办法
126
查看次数

标签 统计

common-lisp ×3

usocket ×3

lisp ×1

networking ×1

sockets ×1

tcp ×1

websocket ×1