【发布时间】:2015-12-07 02:07:23
【问题描述】:
我正在尝试使用 usocket 库编写一个简单的服务器程序,该程序将执行一项相对微不足道的任务 - 例如,回显数据。我想让它能够对多个客户端执行此操作,而不是在等待来自任何单个客户端的输入时阻止单个线程。我发现可以使用wait-for-input 和:timeout 0 检查给定的套接字是否已准备好输入。但是我很难让read-sequence 以我想要的方式工作。如果我给它一个包含 50 个元素的数组,但只有 5 个可用,它会等到 50 个可用时才将它们放入数组中。
有没有什么方法可以一次(有效地)只用一个线程读取块,而不必一直等待输入?还是我真的必须一遍又一遍地打电话给read-byte,直到我得到所有东西?
如果有一些等同于read-sequence 的内容只能读取当时可用的内容,或者如果有一些函数可以告诉我有多少元素可以读取,那么我可以绕过这个问题适当地调整数组大小。但我不知道这两个。
更新:我专门寻找不需要读取字符的二进制解决方案,因此涉及read-char-no-hang、listen 等的解决方案不会有太大帮助,除非它们具有二进制等效项。我不想使用字符,因为某些字符编码(例如 UTF-8)可能具有没有字符表示的无效字节序列,并且我希望能够处理 any 序列字节。而且我特别在寻找不需要一次又一次地读取一个字节的解决方案,或者确认不存在这样的解决方案(在标准中),在这种情况下,我很想听听最方便的可以提供实现该目标所需的最低限度的库。不仅一次读取一个字节不是最快的方法,它还需要我编写的任何函数以非阻塞方式执行此操作,以对每个字节使用usocket 的wait-for-input 函数(因为@ 987654330@ 不适用于字节流),这将需要函数了解套接字,我将不得不编写一个过于具体的 read-all-bytes 函数,该函数不适用于文件流。有可能,但我希望有更通用的方法。
【问题讨论】:
标签: common-lisp polling usocket