C++ 使用google proto缓冲区发送/接收数据
我需要设计一个套接字,它将侦听端口的传入请求,并发送应答以响应这些请求。 这些套接字还将负责在某些事件上向端口发送数据(这与上述接收到的数据无关) 所有这些我都和google proto buffer有关C++ 使用google proto缓冲区发送/接收数据,c++,sockets,C++,Sockets,我需要设计一个套接字,它将侦听端口的传入请求,并发送应答以响应这些请求。 这些套接字还将负责在某些事件上向端口发送数据(这与上述接收到的数据无关) 所有这些我都和google proto buffer有关 任何人都可以建议我在这些方面提供一些好的文章或者提供帮助。 < p>你可以使用C++的任何网络库的PROTO缓冲区。要发送proto buffer,只需在proto buffer对象上调用SerializeToArray,然后通过网络发送该数组。若您接收到对象,请使用ParseFromArra
任何人都可以建议我在这些方面提供一些好的文章或者提供帮助。 < p>你可以使用C++的任何网络库的PROTO缓冲区。要发送proto buffer,只需在proto buffer对象上调用
SerializeToArray
,然后通过网络发送该数组。若您接收到对象,请使用ParseFromArray
函数将数组反序列化回proto buffer对象
boost asio可以用于此,请参见服务器和客户端示例
示例(仅用于展示概念):
类连接{
公众:
连接(常量std::字符串和服务器,常量std::字符串和端口)
尝试
:是否正常(错误)
,解析器(ioservice)
,查询(服务器,端口)
,套接字(ioservice)
{
谷歌协议验证版本;
asio::connect(套接字、解析器、解析(查询));
}catch(…){抛出异常(“无法连接”);}
~connection(){
插座关闭();
}
bool发送和接收(查询*q,响应*r){
如果(0==q)返回false;
int query_length=q->ByteSize();
std::向量buf(查询长度);
if(false==q->SerializeToArray(&(buf[0]),查询长度)){
好吧,谷歌协议缓冲区本身就有很好的文档记录。只需转到
class connection {
public:
connection(const std::string& server, const std::string& port)
try
: is_ok_(false)
, resolver_(ioservice_)
, query_ (server, port)
, socket_ (ioservice_)
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
asio::connect(socket_, resolver_.resolve(query_));
} catch (...) { throw exception("Couldn't connect"); }
~connection() {
socket_.close();
}
bool send_receive(Query* q, Response* r) {
if (0 == q) return false;
int query_length = q->ByteSize();
std::vector<uint8_t> buf(query_length);
if (false == q->SerializeToArray(&(buf[0]), query_length)) {
std::cerr << "Couldn't serialize protobuf" << std::endl;
return false;
}
socket_.write_some(asio::buffer(buf));
if (0 == r) return false;
size_t s = socket_.read_some(asio::buffer(buf));
r->ParseFromArray(&(buf[0]), (int)buf.size());
}
private:
boost::asio::io_service ioservice_;
tcp::resolver resolver_;
tcp::resolver::query query_;
tcp::socket socket_;
bool is_ok_;
}