Hello,

I installed protobuf 2.4.1 on Ubuntu 10.04 64bits. I executed the
example with C++ and Java and it worked fine.

I'm now trying to write my own program, which is composed of two
parts. I want to exchange a set of data (a message containing two
fields: phi and distance) between a C++ (server) program and a Java
(client) program.

The C++ part which is the server opens a TCP/IP socket and waits for
the Java part to send data. The Java part opens a socket on the same
port/address as the C++ part and sends data.

The socket seems to work, but I get the following error :

C++ part :
Start !
recv size:4
recv size:21
recv size:0
libprotobuf ERROR google/protobuf/message_lite.cc:123] Can't parse
message of type "gpb.IRobotData" because it is missing required
fields: phi, distance
has not phi
has not distance
phi:0, distance:0
Quit !


Java part:
Start !
phi:0.5, distance:1.6
Quit !


The important parts of the code are the following :
IRobotData.proto :
----------------------------------------------------------------
package gpb;

option java_package = "gpb";
option java_outer_classname = "IRobotProto";

message IRobotData {
  required double phi = 1;
  required double distance = 2;
}
----------------------------------------------------------------
C++ :
----------------------------------------------------------------
#include <iostream>
#include <ostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "iRobot.pb.h"

gpb::IRobotData data;
   char buf[1000];
   string strbuf;
   ssize_t recvSize;

   sock = socket(AF_INET, SOCK_STREAM, 0);

   if(sock != INVALID_SOCKET)
   {
      sin.sin_addr.s_addr = htonl(INADDR_ANY);
      sin.sin_family = AF_INET;
      sin.sin_port = htons(PORT);

      sock_err = bind(sock, (SOCKADDR*)&sin, recsize);

      if(sock_err != SOCKET_ERROR)
      {
         sock_err = listen(sock, 5);

         if(sock_err != SOCKET_ERROR)
         {
            csock = accept(sock, (SOCKADDR*)NULL, NULL);

            string getData;

            while( (recvSize = recv(csock, buf, sizeof(buf), 0)) > 0)
{
               cout << "recv size:" << recvSize << endl;
               if(recvSize < 0)
                  cerr << "recv() failed" << endl;
               strbuf.append(buf, recvSize);
            }
            cout << "recv size:" << recvSize << endl;

            data.ParseFromString(strbuf);
            if(data.has_phi()) {
               cout << "has phi" << endl;
            } else {
               cout << "has not phi" << endl;
            }

            if(data.has_distance()) {
               cout << "has distance" << endl;
            } else {
               cout << "has not distance" << endl;
            }
            cout << "phi:" << data.phi() << ", distance:" <<
data.distance() << endl;
         }
         else
         {
            cerr << "listen failed" << endl;
         }
      }
      else
      {
         cerr << "bind failed" << endl;
      }
      shutdown(csock, 2);
      close(csock);
      close(sock);
   }
   else
   {
      cerr << "socket failed" << endl;
   }
----------------------------------------------------------------
Java :
----------------------------------------------------------------
Socket sock;
                try {
                        sock = new Socket("localhost", 10101);
                        ObjectOutputStream oos = new
ObjectOutputStream(sock.getOutputStream());
                        CodedOutputStream cos = 
CodedOutputStream.newInstance(oos);


                        //for(int i=0 ; i<10 ; i++){
                                IRobotData data = getRobotData();

                                System.out.println("phi:"+data.getPhi()+",
distance:"+data.getDistance());
                                cos.writeRawVarint32(data.getSerializedSize());
                                data.writeTo(cos);
                                cos.flush();
                                oos.flush();

                                /*
                                try {
                                        Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        } */

                        sock.close();


                } catch (UnknownHostException e1) {
                        System.err.println("Host inconnu !");
                        e1.printStackTrace();
                } catch (IOException e1) {
                        System.err.println("I/O erreur !");
                        e1.printStackTrace();
                }
----------------------------------------------------------------

Do you have any idea why I got the error ? I might not manage
correctly the serialisation/deserialisation thing, but I don't know
how to improve it.

Thanks.

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to