2016-05-14 5 views
2

Привет, коллеги-программисты.Включить поток в аргумент функции для использования Telnet и Ncurses

Я разрабатываю программу C/C++ с сокетами, которые должны подключаться к серверу через Telnet.

Для отправки текстовых и ANSI коды на удаленный терминал Telnet Я использую эту несильно:

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

Есть ли способ, чтобы создать объект потока как соиЬ, сегг, забивают или даже FILE (от C), который отправляет все, что попадает в функцию?

Например:

clientout << "Hello World"; 

назвали бы что-то вроде этого:

writeline(clientout.str()); //or alike 

я сделал что-то вроде этого в прошлом году, когда я запрограммирован микропроцессор (с АВР) и перенаправлен стандартный вывод в функцию который отправил все в соединение 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::istream, std::ostream и/или std::iostream (которые имеют конструктор, который принимает указатель на std::streambuf).

Теперь у вас есть поток, который читает и/или записывает в сокет.

+0

я вижу. Есть ли способ получить «ФАЙЛ» из «streabuf»? Это просто, что 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', то я боюсь, что для написания учебника для подкласса' std :: streambuf' потребуется более 500 символов, которые могут войти в комментарий stackoverflow.com. –