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

时间:2016-05-14 01:50:19

标签: c++ c sockets telnet ncurses

Hello其他程序员。

我正在开发一个带有套接字的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。要使用它,我需要this函数,它需要一个输入流和另一个输出流。

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

2 个答案:

答案 0 :(得分:2)

是的,可以这样做,但这需要相当多的工作。

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

获得std::streambuf子类后,可以实例化std::istreamstd::ostream和/或std::iostream(其构造函数指向一个指针) std::streambuf)。

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

答案 1 :(得分:-1)

你能使用boost asio吗?

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

的示例