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

C++ 将流转换为函数参数以使用Telnet和Ncurses,c++,c,sockets,telnet,ncurses,C++,C,Sockets,Telnet,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,甚至是一个文件(来自C

各位程序员好

我正在开发一个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,甚至是一个文件(来自C),将它得到的所有东西都发送给函数?

例如:

clientout << "Hello World";
去年我做了类似的事情,当时我编程了一个微处理器(带有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;
   //(...)
}
static int-usart\u putchar(字符c,文件*流)
{

虽然(!(UCSR0A&(1是的,这是可能的,但这是相当多的工作

基本上,您必须实现一个子类
std::streambuf
,该子类实现了
std::streambuf
的虚拟方法来直接从套接字读写,或者调用您在问题中展示的包装函数。这并不是真正的大量工作,只是少数虚拟方法,但您必须取消理解它们模糊的语义,并100%正确地实现它们。没有错误的余地

一旦有了
std::streambuf
子类,就可以实例化
std::istream
std::ostream
、和/或
std::iostream
(其构造函数采用指向
std::streambuf
的指针)


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

您可以使用boost asio吗


参见使用<代码> POSIX::SturnScript描述符< /C>实现聊天应用程序

这不是被问到的。我知道。有没有办法从“Struabuf”中获得“文件”?只是NcRISS不是C++的。函数的定义是“Schut*NealType(char *类型,file *Outfd,file *fnd)”。谢谢。我已经检查了SeleBuF中的每个受保护的虚拟函数,但是无法理解如何暗示你所说的。你可以告诉我如何才能做到吗?<代码>文件<代码>是C,不是C++。你不能不知何故将C++代码>文件>代码> STD::SLUBUF。至于子类<代码>:STL:,恐怕要写一篇关于子类化
std::streambuf
的教程,stackoverflow.com评论中可能需要超过500个字符。你不需要给我一步一步的解决方案。我只需要知道一些信息,这样我就可以开始自己寻找答案了。如果你知道如何做到这一点做完了,请给我解释一下这件事。
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;
   //(...)
}