C套接字程序 - 如何在更新stdout读取时接受用户输入?

时间:2010-10-16 05:27:31

标签: c

我在C中编写了一个小的irc bot应用程序。它只是将服务器消息写入屏幕。这只是通过从服务器filedescriptor读取的while循环来完成的。我怎样才能同时接受输入?我现在想扩展它以接受用户输入,以便它可以用作客户端应用程序。我是C开发的新手,所以我不确定这是如何实现的。有人可以给我一个例子,还是指向一些文档的方向?

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

非常感谢任何帮助/建议。

修改

我正在Unix环境中开发。

谢谢

3 个答案:

答案 0 :(得分:4)

如果可以,请避免多进程和多线程编程。那条路导致痛苦。使用事件驱动编程。对于您想要做的事情类型,事件驱动编程更容易,并且表现也一样好。 C中用于事件驱动编程(与I / O相关)的两种主要方式是selectpoll

以下是使用select:

的工作示例
#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);
            }

        }
    }
}

FD_SET用于创建要选择的文件描述符列表(从中获取事件)。 select成功返回后(意味着有一个要处理的事件),使用FD_ISSET查找导致事件的文件描述符。在您的情况下,您将拥有一个打开的套接字文件描述符,您将添加到该组并进行适当的处​​理。

有用的文档包括以下手册页:

  • man 2 select
  • man 2 poll
  • man 3 read
  • man 3 open

答案 1 :(得分:2)

您想监视套接字和stdin。如果那是正确的,请在这里查看select()系统调用:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#select

答案 2 :(得分:-2)

有一个叫做多线程的小东西。多线程(在C ++中)完全取决于操作系统或外部库。

如果您使用的是Windows,则可以使用“Windows.h”中定义的beginthread()和endthread()。

这很容易使用。