Приложение C ++ не может получать последовательные сообщения от приложения C # - PullRequest
1 голос
/ 18 июня 2011

Моя проблема в том, что когда я делаю

TcpClient con = new TcpClient ("127.0.0.1", 5432);
            NetworkStream str = con.GetStream ();
Annoucement msg = new Annoucement ();
            msg.typ = Annoucement.msgType.NOWY_GRACZ;

            Serializer.SerializeWithLengthPrefix (str, msg, PrefixStyle.Base128);
            Serializer.SerializeWithLengthPrefix (str, msg, PrefixStyle.Base128);

и я пытаюсь получить с пользовательской библиотекой, которая использует буферы протокола

Connection con = server.accept();

    Annoucement ann = con.receive();
    cout << ann.typ() << endl;

    ann = con.receive();
    cout << ann.typ() << endl;

Я могу читать только первый. Второе неверно, потому что поле typ установлено в 0, тогда как оно должно быть 3. Я думаю, что функция receive делает что-то не так, но не знает, что.

  Annoucement Connection::receive() throw(EmptySocket) {
    CodedInputStream coded_input(raw_input);
    google::protobuf::uint32 n;
    coded_input.ReadVarint32(&n);
    char *b;
    int m;
    coded_input.GetDirectBufferPointer((const void**)&b, &m);
    Annoucement ann;
    ann.ParseFromArray(b, n);
    return ann;
  }

одна переменная инициализируется в конструкторе

FileInputStream* raw_input;
 raw_input = new FileInputStream(s);  //s is socket in this example communication

Как я могу изменить его, чтобы я мог читать последовательные сообщения из сокета?

1 Ответ

1 голос
/ 18 июня 2011

Из ссылки :

Устанавливает * данные для указания непосредственно на непрочитанную часть базового буфера CodedInputStream, а * size соответствует размеру этого буфера, но делаетне улучшать текущую позицию потока.

Это всегда будет либо создавать непустой буфер, либо возвращать false.Если вызывающая сторона использует какие-либо из этих данных, она должна затем вызвать Skip (), чтобы пропустить использованные байты.Это может быть полезно для реализации внешних процедур быстрого разбора для типов данных, не охватываемых интерфейсом CodedInputStream.

Я вижу, что в вашем коде их нет:

  1. Обработка случаягде оба объявления уже находятся в буфере при первом вызове.
  2. Вызов coded_input.Skip() (должен охватывать # 1 выше, если используется правильно)
  3. Обработка ошибок (включая случай, когда нетобъявления уже находятся в буфере при вызове).

Я предполагаю, что ваша проблема вызвана № 3 выше, но я не уверен, пока не увижу код ParseFromArray.

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