各位程序员好。
我正在开发一个带有套接字的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::istream
、std::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