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