我需要设计一个套接字,它将侦听传入请求的端口并发送回复以响应这些请求。 这些套接字还负责在某些事件上将数据发送到端口(这与上面提到的数据无关)。
所有这一切都与google proto buffer有关。
任何人都可以建议我提供一些关于这些的好文章或者为我提供帮助。
答案 0 :(得分:0)
您可以将proto缓冲区与任何C ++网络库一起使用。要发送proto缓冲区,只需在proto缓冲区对象上调用SerializeToArray
,然后通过网络发送该数组。如果您收到对象,请使用ParseFromArray
函数将数组反序列化回原始缓冲区对象。
可以使用boost asio,请参阅服务器和客户端here
的示例示例(仅用于显示概念):
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_;
}