我用 C 编写了一个小的 irc bot 应用程序。它只是将服务器消息写出到屏幕上。这只是通过从服务器文件描述符读取的 while 循环来完成的。如何同时接受输入?我现在想扩展它以接受用户输入,以便它可以用作客户端应用程序。我是 C 开发的新手,所以我不确定这是如何完成的。有人可以为我提供示例或为我指明某些文档的方向吗?
我基本上想模仿一个 telnet 应用程序。标准输出已更新,用户可以在控制台提供服务器命令。
任何帮助/建议将不胜感激。
编辑
我正在 Unix 环境中开发。
谢谢
如果可以,请避免多进程和多线程编程。那条路通向痛苦。使用事件驱动编程。对于您想要做的事情类型,事件驱动编程要容易得多,而且性能也一样。C 中进行事件驱动编程(与 I/O 相关)的两种主要方式是select和poll。
这是使用选择的工作示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval, len;
char buf[4096];
while (1) {
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1) {
perror("select()");
exit(EIO);
} else if (retval) {
printf("Data is available now.\n");
} else {
printf("No data within five seconds.\n");
continue;
}
if (FD_ISSET(0, &rfds)) {
len = read(0, buf, 4096);
if (len > 0) {
buf[len] = 0;
printf("Got data on stdin: %s\n", buf);
} else {
// fd closed
perror("read()");
exit(EIO);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
FD_SET 用于创建要选择的文件描述符列表(从中获取事件)。select 成功返回后(意味着有一个事件要处理),您可以使用 FD_ISSET 查找导致事件的文件描述符。在您的情况下,您将拥有一个打开的套接字文件描述符,您将其添加到集合中并进行适当的处理。
有用的文档包括以下手册页:
man 2 selectman 2 pollman 3 readman 3 open