我正在使用input_line
函数从客户端套接字读取新数据,但是当流中没有任何内容可读取时,该函数会停止线程。我的目标是构建一个函数,当没有什么要读取时返回一个空字符串(即“”),而不是停止线程。
您将如何使用input_line
或其他方法构建此功能?
input_line
End_of_file
到达文件末尾时引发异常。只需捕获异常并返回空字符串:
try input_line ic with End_of_file -> ""
您可以使用该input
功能,该功能低于input_line
并且不会阻塞,而是报告它可以读取比您要求的字符少的字符。
如果您想对输入/输出进行较低级别的控制(阻塞读取、轮询等),您或许应该使用可以操作底层文件描述符的Unix模块。它使您可以特别访问Unix.select 函数以等待一组输入,或低级Unix.read和Unix.write输入-输出函数。
最后,您可能会对在线书籍Unix System Programming in OCaml感兴趣,其中包含此类程序的示例。
当流中没有任何内容可读取时,该函数停止线程
不,它没有。当没有数据可供读取时,它会阻塞线程。发送者可能会在一分钟、一小时或一天内发送更多数据。
条件“没有什么可以从流中读取”意味着对等方已经关闭了连接,在这种情况下你不会被阻塞,你会得到某种流结束指示。
我的目标是构建一个函数,当没有什么要读取时返回一个空字符串(即“”),而不是停止线程。
然后你需要使用非阻塞模式,或者MSG_PEEK
如果它可以通过你的 API 使用。