2012-09-02 24 views
2

我想通过protobuf序列化一些数据并通过套接字(winsock2)发送它,但wathever我做,我做不到。如果有人能给我一个简单的例子说明如何去做,我会非常感谢。我已经检查过Google的文档,但没有有用的例子,对于初学者来说我的解释是不可理解的。 在此先感谢您的帮助!那么我现在要做的是:如何发送序列化的数据与protobuf通过套接字在c + +

客户端:


printf("Sporočilo: "); 

getline(cin, line); 

if(line == "exit") break; 

printf("ID odjemalca: "); 

cin >> id; 

message::Message sporocilo; 

sporocilo.set_bodytext(line); 

sporocilo.set_uniqueid(id); 

//... some usefull code for serializing data and send it over socket 

send(sClient, Message, sizeof(Message), 0); 

服务器端:


WSARecv(Socket, &(DataBuf), 1, &RecvBytes, &Flags, NULL, NULL); 

//... some usefull code for deserializing data and getting out bodytext and uniqueid 

cout << sporocilo.bodytext(); 

cout << sporocilo.uniqueid(); 
+0

你的问题是什么?当你运行你的代码时会发生什么? –

+0

那么,问题是我不明白如何使用protobuf序列化数据并将其发送到套接字。我尝试了一些代码,但在服务器端我收到消息:libprotobuf错误c:\ temp \ protobuf-2.4.1 \ src \ google \ protobuf \ message_lite.cc:123 ]无法解析类型为“消息的消息.Message“,因为它缺少必填字段:uniqueid,bodytext;如果有人可以在客户端和服务器端写下这几行代码,并向我解释它是如何工作的,我真的很惊讶! – user1641787

+0

message :: Message的定义在哪里? –

回答

3

序列化的最简单的方法是简单地说:

string buffer; 
sporocilo.AppendToString(&buffer); 
send(sock, buffer.c_str(), buffer.size(), 0); 

很难说如果你在接收端做了错误的事情,而没有包含WSARecv之前和之后的代码。

+0

非常感谢您的回答。我也在尝试这种方法,但在这种情况下,我无法发送č,ž,š,... caracters - geeting错误:libprotobuf错误c:\ temp \ protobuf-2.4.1 \ src \ google \ protobuf \ wire_format .cc:1059 ]解析协议缓冲区时遇到包含无效的UTF-8数据的字符串。字符串只能包含UTF-8;对原始字节使用“字节”类型。 – user1641787

+0

,因为我可以通过谷歌文档,发送数据到套接字最合适的序列化是SerializeToCodedStream方法,但这对我来说很简单,以了解如何在我的解决方案中实现id。 – user1641787

+0

“字符串只能包含UTF-8”错误与您如何序列化原始消息完全无关。如果您使用的是非UTF-8编码的字符串,则应该在.proto文件中将该字段声明为“字节”,而不是“字符串”。或者(最好)您可以使用UTF-8编码国际字符串,而不是使用传统编码。 –

相关问题