你的问题在这里:
star pkt;
recv(csd,&pkt,sizeof(pkt),0);
和这里:
star pkt;
pkt.set_name("Pratap");
cout<<"Send Data without help of another variable....\n";
send(sd,&pkt,sizeof(pkt) ,MSG_CONFIRM);
您无法接收/发送star
直接实例化,无需首先将其从 protobuf 有线格式反序列化。看看ParseFrom
SerializeTo
的方法protobuf::MessageLite https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message_lite#MessageLite class.
最好的方法是首先以固定格式发送序列化消息的长度(例如uint32_t
按网络字节顺序)。然后接收者可以先读取该消息并分配适当大小的缓冲区,然后再接收随后发送的序列化消息。
UPDATE:
尝试一下。像这样:
发送者.cpp
star pbMsgObj;
pbMsgObj.set_name("Pratap");
std::string pkt;
pbMsgObj.SerializeToString(&pkt); // Serialize the message object to
// protobuf wire format.
uint32_t msgLength = pkt.size();
uint32_t sndMsgLength = htonl(msg_length); // Ensure network byte order
send(sd,&sndMsgLength ,sizeof(uint32_t) ,MSG_CONFIRM); // Send the message length
send(sd,pkt.c_str() ,msgLength ,MSG_CONFIRM); // Send the message data
接收器.cpp
star msgObject;
uint32_t msgLength;
recv(csd,&msgLength,sizeof(uint32_t),0); // Receive the message length
msgLength = ntohl(msgLength); // Ensure host system byte order
std::vector<uint8_t> pkt; // Allocate a receive buffer
pkt.resize(msgLength,0x00);
recv(csd,&(pkt[0]),msgLength,0); // Receive the message data
std::string tmp;
tmp.assign(&(pkt[0]),pkt.size()); // Convert message data to a string
msgObject.ParseFromString(tmp); // Deserialize the message object from
// protobuf wire format.
NOTE:
从/到与各种语言绑定一起使用的独特、高效的有线格式进行反/序列化是谷歌协议缓冲区的全部要点。
为了摆弄可能的发送者/接收者模式的位,而不是创建“原始”套接字,您可能会发现0MQ http://zeromq.org/是一个有用的框架。无论如何,听听好的建议(!):保持消息(有效负载)格式和发送/接收行为尽可能分开。