繁体   English   中英

C套接字程序-更新标准输出的读数时如何接受用户输入?

[英]C Socket program - How can I accept user input while updating reading from stdout?

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

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

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

编辑

我正在Unix环境中进行开发。

谢谢

如果可以,请避免进行多进程和多线程编程。 那条路导致痛苦。 使用事件驱动的编程。 对于您想要做的事情,事件驱动的编程要容易得多 ,并且执行效果也一样。 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

您要同时监视套接字和标准输入。 如果那是正确的,请在此处查看select()系统调用: http : //beej.us/guide/bgnet/output/html/singlepage/bgnet.html#select

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

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

它很容易使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM