我正在编写一个执行服务器 - 客户关系的程序
在程序中,我使用select()
来获取客户端的请求,以及用户的请求(服务器后面的请求)来自stdin。
看起来似乎是select()
适用于客户的请求,但似乎没有响应stdin
的输入。
此外,我没有成功recv()
stdin
。
有没有办法以非阻塞方式从stdin获取输入?我尝试使用fgets()
代替select()
,并且我已将fcntl()
设置为非阻止,但它似乎无效 - 它仍然是阻止的。
你有什么建议? 感谢。
答案 0 :(得分:1)
stdin是行缓冲的 - 你无法以非阻塞的方式读取它。
答案 1 :(得分:0)
您始终可以使用kbhit查看输入缓冲区中是否有任何字符可供读取。
如果您无法访问kbhit
,则以下是我过去使用过的简单实现:
int kbhit() {
int count = 0;
struct termios otty, ntty;
tcgetattr(STDIN_FILENO, &otty);
ntty = otty;
ntty.c_lflag &= ~ICANON;
if(tcsetattr(STDIN_FILENO, TCSANOW, &ntty) == 0) {
ioctl(STDIN_FILENO, FIONREAD, &count);
tcsetattr(STDIN_FILENO, TCSANOW, &otty);
}
return count;
}