2

我正在构建一个客户端/服务器模型,但使用套接字、使用命名管道和 mkfifo()。

客户端将输出写入名称管道,我使用以下命令读取服务器中的输入:

while ((n = read(fd_in, &newChar, 1)) == 1) { /* ... */ }

我一次读一个字符,直到遇到两个字符:<'CR'><'LF'>。我想以这样一种方式制作我的代码,如果客户端在一段时间后没有以 <'CR'><'LF'> 终止,我可以丢弃它并继续到另一个客户端,否则下一个客户端将拥有等待,也许是无限的。

有没有办法终止 read() 的执行?如果2秒内没有返回,我可以说中断读取并丢弃之前读取的字符,然后重新开始读取好吗?

谢谢您的帮助,

杰里

4

3 回答 3

4
#include <stdbool.h>
#include <poll.h>

do {
    ssize_t ret;
    struct pollfd ps = {.fd = fd_in, .events = POLLIN}; 

    if (poll(&ps, 1, 2000) < 0)
        break; /* kick client */
    ret = read(in_fd, ...);
    if (ret != 1)
        break;
    /* process read data */
} while (true);

这会检查是否有要读取的数据;如果没有在 2000 毫秒内,做任何你想做的事(例如断开连接)。

于 2011-02-08T00:26:17.673 回答
3

尝试在 FIFO 的读取端传递O_NONBLOCK标志。open这应该会改变行为,以便read即使请求的字符数不在管道中,也会立即返回。

于 2011-02-08T00:34:03.463 回答
1

要同时处理多个客户端,您应该使用 将文件描述符设置为非阻塞fcntl(),然后使用select()poll()阻塞直到输入出现在其中至少一个上。

于 2011-02-08T01:08:04.330 回答