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



各位程序员好。

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

要将文本和ANSI代码发送到Telnet远程终端,我使用以下功能:

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)进行了编程,并将stdout重定向到一个函数中,该函数将所有内容发送到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。要使用它,我需要这个函数,它需要一个流作为输入,另一个流用于输出。

我为这个长问题道歉。提前谢谢。

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

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

一旦您有了std::streambuf子类,您就可以实例化std::istreamstd::ostream和/或std::iostream(它们有一个构造函数,该构造函数接受指向std::streambuf的指针)。

现在,您有了读取和/或写入套接字的流。

你能使用boost asio吗?

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

最新更新