将流转换为函数参数以使用 Telnet 和 Ncurses
Turn stream into function argument to use Telnet and Ncurses
各位程序员大家好。
我正在开发一个 C/C++ 程序,其套接字应该通过 Telnet 连接到服务器。
要向 Telnet 远程终端发送文本和 ANSI 代码,我正在使用此功能:
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)进行编程并将标准输出重定向到一个将所有内容发送到 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 函数,该函数需要一个流用于输入,另一个用于输出。
很抱歉问题太长了。
提前谢谢你。
是的,可以做到这一点,但工作量很大。
基本上,您必须实现 std::streambuf
的子类,该子类实现 std::streambuf
的虚拟方法以直接从套接字读取和写入,或者调用您在问题中显示的包装函数。这不是真的很多工作,它只是少数虚方法,但你必须理解它们晦涩的语义,并正确地实现它们, 100%。没有错误余地。
一旦你有了 std::streambuf
子类,你就可以实例化一个 std::istream
、std::ostream
、and/or std::iostream
(它有一个构造函数需要指向 std::streambuf
).
的指针
现在,您的流读取 and/or 写入套接字。
你可以使用 boost asio 吗?
查看使用 posix::stream_descriptor
实现聊天应用程序的示例 http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/chat/posix_chat_client.cpp
各位程序员大家好。
我正在开发一个 C/C++ 程序,其套接字应该通过 Telnet 连接到服务器。
要向 Telnet 远程终端发送文本和 ANSI 代码,我正在使用此功能:
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)进行编程并将标准输出重定向到一个将所有内容发送到 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 函数,该函数需要一个流用于输入,另一个用于输出。
很抱歉问题太长了。 提前谢谢你。
是的,可以做到这一点,但工作量很大。
基本上,您必须实现 std::streambuf
的子类,该子类实现 std::streambuf
的虚拟方法以直接从套接字读取和写入,或者调用您在问题中显示的包装函数。这不是真的很多工作,它只是少数虚方法,但你必须理解它们晦涩的语义,并正确地实现它们, 100%。没有错误余地。
一旦你有了 std::streambuf
子类,你就可以实例化一个 std::istream
、std::ostream
、and/or std::iostream
(它有一个构造函数需要指向 std::streambuf
).
现在,您的流读取 and/or 写入套接字。
你可以使用 boost asio 吗?
查看使用 posix::stream_descriptor
实现聊天应用程序的示例 http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/chat/posix_chat_client.cpp