将流转换为函数参数以使用Telnet和Ncurses
Turn stream into function argument to use Telnet and 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::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
- 无法同时编译 ncurses 和字符串
- C++ 无法识别创建进程'telnet'
- ncurses 找不到任何关于cchar_t的文档
- 无法将 ncurses 函数与LD_PRELOAD挂钩
- Ncurses CTRL + s hangs getch()
- ncurses getch() 奇怪的输出?
- 将光标位置存储在类对象中(ncurses c++)
- Apple Mach -o(ID)链接器错误,ncurses
- 当nCurses应用程序来自后台时无效内容
- 为什么我不能提供一个字符串参数来打印 ncurses?
- 将ncurses应用程序移植到iOS
- 在C 中获取Ncurses Chtype或未符号字符的整数值
- 如何在Ncurses应用程序中使用读取线
- ncurses clear() 会导致闪烁
- 使用 c++ 在 ncurses 中打印子菜单时出现问题
- ncurses (Terminal Emulator) Unicode 不可靠的下标
- 使用 Ncurses 时不打印的宽字符 (C++)
- ncurses newwin() 和 mvwin() 没有按预期运行
- 在带有 ncurses (C++) 的同一字符串流中使用不同的颜色
- 将流转换为函数参数以使用Telnet和Ncurses