2016-05-14 55 views
2

各位程序员您好。将流转换为函数参数以使用Telnet和Ncurses

我正在开发一个带有应该通过Telnet连接到服务器的套接字的C/C++程序。

要发送短信,ANSI代码到Telnet远程终端我使用这个funcion:

void writeline(int socketfd, string line) 
{ 
    string tosend = line + "\n"; 
    write(socketfd, tosend.c_str(), tosend.length()); 
} 

有没有一种方法来创建一个像COUT流对象,CERR,堵塞,甚至一个文件(从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函数,它需要一个流输入和另一个输出。

对于长期的问题,我表示歉意。 预先感谢您。

回答

2

是的,有可能这样做,但这是相当多的工作。

基本上,你必须实现一个std::streambuf的子类,它实现了std::streambuf的虚拟方法来直接从套接字读写,或者调用你在问题中显示的包装函数。它不是确实是很多工作,它只是少数虚拟方法,但你必须了解它们的晦涩语义,并正确实施它们,100%。没有误差的余地。

一旦你有你std::streambuf子类,然后你可以实例化一个std::istreamstd::ostream,和/或std::iostream(其中有一个构造函数指针的std::streambuf)。

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

+0

我看到的。有没有办法从“streabuf”获取“FILE”?这只是ncurses不适用于C++。函数的定义是“SCREEN * newterm(char * type,FILE * outfd,FILE * infd)”。谢谢。 –

+0

我已经检查了streambuf中的每个受保护的虚拟函数,但无法理解如何执行你所说的内容。 http://www.cplusplus.com/reference/streambuf/streambuf/你能告诉我我该怎么做吗? –

+0

'FILE'是C,而不是C++。你不能以某种方式将C'FILE'指针附加到C++'std :: streambuf'。至于'std :: streambuf'的子类化,恐怕要花费超过500个字符才能进入stackoverflow.com评论,以便编写一个为std :: streambuf进行子类化的教程。 –

相关问题