C Socket 程序 - 如何在从标准输出更新读取时接受用户输入?

Nic*_*ick 2 c

我用 C 编写了一个小的 irc bot 应用程序。它只是将服务器消息写出到屏幕上。这只是通过从服务器文件描述符读取的 while 循环来完成的。如何同时接受输入?我现在想扩展它以接受用户输入,以便它可以用作客户端应用程序。我是 C 开发的新手,所以我不确定这是如何完成的。有人可以为我提供示例或为我指明某些文档的方向吗?

我基本上想模仿一个 telnet 应用程序。标准输出已更新,用户可以在控制台提供服务器命令。

任何帮助/建议将不胜感激。

编辑

我正在 Unix 环境中开发。

谢谢

kan*_*aka 5

如果可以,请避免多进程和多线程编程。那条路通向痛苦。使用事件驱动编程。对于您想要做的事情类型,事件驱动编程要容易得多,而且性能也一样。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 select
  • man 2 poll
  • man 3 read
  • man 3 open