2010-01-21 2 views
1

Мне нужно реализовать простое сетевое взаимодействие в C++, и мне было интересно, есть ли библиотеки, которые уже это делают. Мой протокол в основном отправляет сообщения и получает ответы. Каждое сообщение представляет собой всего лишь набор из 3-4 значений базовых типов данных. Я хотел бы найти библиотеку (или библиотеки), которая может выполнять одно или несколько из следующих действий:Ищет библиотеку для простой реализации протокола

  1. Сериализовать значения в эффективном массиве байтов (я не могу использовать сериализацию на основе текста).
  2. Отправить сообщение и дождаться результата (он может блокировать или получать ответ асинхронно, мне все равно).
  3. Он должен иметь возможность коррелировать между отправленным сообщением и ответом.

В идеале я хотел бы быть в состоянии написать что-то вроде этого:

// On the sending side 
bool send(const string& str, int x, char y) 
{ 
    Message msg; 
    msg << str << x << y; 

    // Lock until the response arrives 
    return cool_library::send(address, msg); 
} 

// On the receiving side 
bool receive(Message& msg) 
{ 
    string str; 
    int x; 
    char y; 

    msg >> str; 
    msg >> x; 
    msg >> y; 

    if (some conditions...) 
     return true; // the message was handled successfully 
    else 
     return false; 
} 

Обратите внимание, что cool_library :: отправить возвращает истинное не тогда, когда сообщение было успешно отправлено, но когда другая сторона ответила с успехом результат. Все это длинное объяснение - это просто показать, что мне нужна простая функциональность. Ничего особенного. Я даже могу отправлять и получать буферы, но мне нужно что-то, что может соотнести сообщения с ответами. Я не хочу идти на RPC, потому что это кажется мне излишним.

спасибо.

ответ

2

Google protocolbuffers. Я использовал его некоторое время, и он быстрый, расширяемый и довольно легкий.

Это двоичная сериализация с учетом оптимизации времени/сети.

У него нет поддержки для фактически «отправки» через сокеты, но это очень просто, если вы просто отправляете целое число с размером сообщения, а затем сообщение. Таким образом, с другой стороны вы читаете целое число и знаете размер входящего сообщения, чтобы правильно позвонить parseFromArray.

+0

Действительно выглядит как хорошее решение сериализации. Но знаете ли вы что-то, что может управлять жизненным циклом сообщения для меня? Такие вещи, как ответы на сообщения, возможно, повторы? – FireAphis

+0

Кроме того, что вы думаете о библиотеке сериализации boost? – FireAphis

+0

Никогда не применяйте последовательную сериализацию, но если вы хотите что-то, что обрабатывает сетевые вещи и повышает надежность (через TCP), это будет не так дешево, возможно, вам стоит искать более полные рамки. –

1

Перейти к библиотеке буферов протокола Google. Он сводит к минимуму отправленные данные и автоматически генерирует файлы cpp, которые автоматически сериализуются и десериализуются из файла декларации. Он также обратно совместим при выпуске новых версий вашего протокола!

http://code.google.com/p/protobuf/

+1

Это двоичный код, а не текст –

+0

Хорошо, я только что проверил его, действительно, я могу выбирать между текстом и двоичным кодом. Итак, это для сериализации. ответы? – FireAphis

+1

Когда вы определяете свой протокол, вы можете определить тип ответного сообщения. Если вы можете даже очень легко включить исходный запрос в качестве поля в ответе. – rui