Различия между буферизованными потоками в Java и работой с сокетом в C ++? - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь работать с сокетами в C ++. Единственная работа с сокетами, которую я когда-либо делал, была на Java (если быть точным, я создал IRC-бот), и код, который я использовал, выглядел следующим образом -

Socket socket = new Socket(host, port);
BufferedWriter writer = new BufferedWriter(
                             new OutputStreamWriter(socket.getOutputStream()));
BufferedReader reader = new BufferedReater(
                             new InputStreamWriter(socket.getInputStream()));

тогда, чтобы мой бот прочитал, я бы получил новую ветку и запустил цикл while -

String line;
while((line = reader.readLine()) != null) ...

И написать -

writer.write(text);
writer.flush();

Сейчас я пытаюсь сделать это в C ++, и все, конечно, находится на более низком уровне, и я не совсем понимаю, что я делаю. Я искал некоторые уроки по использованию winsock.h и пробовал их все безрезультатно. Мой друг рекомендовал библиотеку сокетов sdl_net.

Мой вопрос: как мой код на C ++ будет выглядеть иначе, чем код, который я использовал для своего IRC-бота на Java? Кроме того, в чем разница между «буферизованными» потоками в Java и моей работой с сокетами более низкого уровня в C ++?

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

Чтобы ответить на ваш главный вопрос, этот урок примерно показывает, как будет выглядеть C ++:

http://www.linuxhowtos.org/C_C++/socket.htm

http://www.linuxhowtos.org/data/6/client.c

По сути, вам нужноиспользуйте вызовы socket() и connect() вместо new Socket().

Потоки C ++ аналогичны необработанным socket.get(Output|Input)Stream() потокам в том смысле, что буферизация не выполняется.Buffered(Output|Input)Stream сохраняет записанные / прочитанные байты в буфере вместо записи в базовый поток для каждого вызова write() / read().Вызов flush() заставляет записывать буферизованные данные.

0 голосов
/ 19 марта 2012

Основная идея любой буферизации - предоставить функцию для извлечения / хранения данных в чанках (например, чтение полной строки) и увеличения производительности.

Буферизация отличается от сокета или любого другого подобного API.Базовое устройство ввода (например, сокет) не должно знать о верхнем уровне буферизации.В то же время буферизация не делает различий, будь то базовый вход от клавиатуры или сокета или от любого другого устройства.Например, в случае использования Java класса BufferedReader базовый входной класс должен предоставлять некоторые интерфейсы, которые можно использовать, например, для чтения / записи данных в виде фрагментов символов или слов.

Итак, что здесь делает BufferedWriterхранить ваши данные, независимо от того, записаны они символьно или буквенно за словом, и очищать их (отправлять на устройство ввода, здесь сокет), когда явно вызывается flush, или передается '\ n', или объект уничтожается, или его буферзаполнен (скажем, maxlen составляет 1024 символа).

Аналогично, в случае BufferedReader, если вы читаете один символ из сокета, он внутренне пытается прочитать около 1024 символов и возвращает вам один символ.Для следующих операций чтения до 1024 символов он сохраняет предыдущие трудоемкие вызовы сокетов и быстро обслуживает их из своего внутреннего буфера чтения, пока он не станет пустым.

Вы можете легко реализовать те же классы Buffered в c ++, которые обертывают системный вызов сокета, обеспечиваяТочно такие же удобства для вас.Для буферизации вы можете использовать stdstream / stringstream std классы для чтения / записи строк, и вы поймете, как их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...