将流转换为函数参数以使用 Telnet 和 Ncurses

Turn stream into function argument to use Telnet and Ncurses

各位程序员大家好。

我正在开发一个 C/C++ 程序,其套接字应该通过 Telnet 连接到服务器。

要向 Telnet 远程终端发送文本和 ANSI 代码,我正在使用此功能:

void writeline(int socketfd, string line)
{
  string tosend = line + "\n";
  write(socketfd, tosend.c_str(), tosend.length());
}

有没有办法创建一个流对象,如 cout、cerr、clog 甚至一个 FILE(来自 C),将它获得的所有内容发送到一个函数?

例如:

clientout << "Hello World";

会这样调用:

writeline(clientout.str()); //or alike

去年我对一个微处理器(使用 AVR)进行编程并将标准输出重定向到一个将所有内容发送到 USART 连接的函数时,我做了类似的事情。我希望我现在能做这样的事情。

当时我是这样做的:

static int usart_putchar(char c, FILE *stream)
{
    while ( !(UCSR0A & (1<<UDRE0)) );
    UDR0 = c;
    return 0;
}

static FILE usart_stream = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE);

int main()
{
   //(...)
   stdout = &usart_stream;
   //(...)
}

我对此很感兴趣,因为除了可以更轻松地打印到远程终端之外,我还需要一个流来考虑在我的程序中使用 ncurses。要使用它,我需要 this 函数,该函数需要一个流用于输入,另一个用于输出。

很抱歉问题太长了。 提前谢谢你。

是的,可以做到这一点,但工作量很大。

基本上,您必须实现 std::streambuf 的子类,该子类实现 std::streambuf 的虚拟方法以直接从套接字读取和写入,或者调用您在问题中显示的包装函数。这不是真的很多工作,它只是少数虚方法,但你必须理解它们晦涩的语义,并正确地实现它们, 100%。没有错误余地。

一旦你有了 std::streambuf 子类,你就可以实例化一个 std::istreamstd::ostream、and/or std::iostream(它有一个构造函数需要指向 std::streambuf).

的指针

现在,您的流读取 and/or 写入套接字。

你可以使用 boost asio 吗?

查看使用 posix::stream_descriptor 实现聊天应用程序的示例 http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/chat/posix_chat_client.cpp