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