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函数,它需要一个输入流和另一个输出流。
我为这个长期问题道歉。 提前谢谢。
答案 0 :(得分:2)
是的,可以这样做,但这需要相当多的工作。
基本上,你必须实现std::streambuf
的子类,它实现std::streambuf
的虚拟方法直接从套接字读取和写入,或调用你在问题中显示的包装函数。它不是 真的 很多工作,它只是少数几个虚拟方法,但你必须理解它们模糊的语义,并实现它们正确的,100%。没有错误的余地。
获得std::streambuf
子类后,可以实例化std::istream
,std::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