【发布时间】:2020-08-02 00:44:02
【问题描述】:
如何检查 TCP 套接字是否仍然打开而不阻塞?
如果我使用usocket,那么如果套接字关闭,则从套接字流中读取将发出文件结束信号,否则会阻止它,这是我不想要的。我曾尝试使用(listen stream) 提前检查套接字是否会被阻塞,但(listen) 在关闭的套接字上返回nil,这在这里没有帮助。我还尝试检查(usocket::state socket),它在关闭的套接字上给出:READ,但它有时也会在打开的套接字上给出:READ,即使那里没有任何东西。我正在使用 sbcl,所以我尝试使用 (sb-bsd-sockets:socket-open-p),但这在封闭的套接字上给出了 T,也没有帮助。唯一似乎有用的命令是(wait-for-input),即在关闭的套接字上调用时它几乎会立即返回,即使给出了更长的超时时间也是如此。同时,(listen) 仍然会给出nil,这两者加起来似乎表明一个关闭的套接字。这种方式在我看来相当骇人听闻。
有没有更好的办法?
【问题讨论】:
-
我会使用 iolib :它有 iolib:socket-connected-p 和事件处理程序(epoll/select 接口)。它还附带了一个很好的套接字教程。
-
@coredump,感谢您的提示,我会检查一下。
标签: sockets tcp common-lisp nonblocking sbcl