我正在构建一个客户端/服务器模型,但是使用带有命名管道的套接字和mkfifo()。
客户端将输出写入名称管道,我使用以下命令读取服务器中的输入:
while ((n = read(fd_in, &newChar, 1)) == 1) { /* ... */ }
我一次只读一个字符,直到遇到两个字符:<'CR'><'LF'>。我想以这样一种方式制作我的代码:如果客户端没有以<'CR'><'LF'>终止。也许过了一段时间后,我可以丢弃它并继续前往另一个客户端,否则下一个客户端将不得不等待,也许是无限期。
有没有办法终止执行read()?如果它在2秒内没有返回,我可以说中断读取并丢弃先前读取的字符,并再次开始阅读吗?
感谢您的帮助,
Jary
答案 0 :(得分: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毫秒内,做任何你想做的事情(例如断开连接)。
答案 1 :(得分:3)
尝试在O_NONBLOCK
FIFO的读取端时传递open
标志。这应该改变行为,以便read
立即返回,即使请求的字符数不在管道中。
答案 2 :(得分:1)
要同时处理多个客户端,您应该使用fcntl()
将文件描述符设置为非阻止,然后使用select()
或poll()
进行阻止,直到输入出现在其中至少一个上