0

我正在使用input_line函数从客户端套接字读取新数据,但是当流中没有任何内容可读取时,该函数会停止线程。我的目标是构建一个函数,当没有什么要读取时返回一个空字符串(即“”),而不是停止线程。

您将如何使用input_line或其他方法构建此功能?

4

3 回答 3

3

input_lineEnd_of_file到达文件末尾时引发异常。只需捕获异常并返回空字符串:

try input_line ic with End_of_file -> ""
于 2013-05-27T08:13:07.313 回答
3

您可以使用该input功能,该功能低于input_line并且不会阻塞,而是报告它可以读取比您要求的字符少的字符。

如果您想对输入/输出进行较低级别的控制(阻塞读取、轮询等),您或许应该使用可以操作底层文件描述符的Unix模块。它使您可以特别访问Unix.select 函数以等待一组输入,或低级Unix.readUnix.write输入-输出函数。

最后,您可能会对在线书籍Unix System Programming in OCaml感兴趣,其中包含此类程序的示例。

于 2013-05-27T08:14:12.830 回答
2

当流中没有任何内容可读取时,该函数停止线程

不,它没有。没有数据可供读取时,它会阻塞线程。发送者可能会在一分钟、一小时或一天内发送更多数据。

条件“没有什么可以从流中读取”意味着对等方已经关闭了连接,在这种情况下你不会被阻塞,你会得到某种流结束指示。

我的目标是构建一个函数,当没有什么要读取时返回一个空字符串(即“”),而不是停止线程。

然后你需要使用非阻塞模式,或者MSG_PEEK如果它可以通过你的 API 使用。

于 2013-05-27T09:57:51.097 回答