2011-06-18 78 views
1

我的問題是,當我做C++應用程序不能接收從C#應用程序連續消息

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.我認爲該函數接收做錯了,但不知道是什麼。

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

reference

將*數據直接在CodedInputStream的 底層緩衝區的 未讀部分指出,和*尺寸爲 大小緩衝區,但不 提前流的當前位置。

這將始終產生一個 非空緩衝區或返回false。如果 調用者使用這些數據中的任何一個,則應該調用Skip()跳過消耗的字節上的 。這可能是 對於實現外部快速解析例程 對於由CodedInputStream 接口覆蓋的數據類型不是 很有用。

我看到這些缺少代碼:

  1. 處理,其中兩個公告都已經在第一次調用緩存中的情況。
  2. 調用coded_input.Skip()(應該覆蓋上面的#1,如果正確使用的話)
  3. 錯誤處理(包括呼叫緩衝區中沒有公告的情況)。

我猜你的問題是由上述#3引起的,但我不確定,直到我看到ParseFromArray的代碼。

相關問題