gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:24 26 4
gpt4 key购买 nike

各位程序员大家好。

我正在开发一个带有套接字的 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)进行编程并将标准输出重定向到一个将所有内容发送到 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::istreamstd::ostream 和/或 std::iostream(它有一个构造函数,该构造函数接受一个指向 std::streambuf 的指针)。

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

关于c++ - 将流转换为函数参数以使用 Telnet 和 Ncurses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com