2016-05-14 54 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進行子類化的教程。 –

相關問題