1
我需要設計一個套接字,它將偵聽傳入請求的端口併發送回復以響應這些請求。 這些套接字也將負責在某些事件上發送數據到端口(與上面提到的數據無關)。使用谷歌原型緩衝區發送/接收數據
這一切,我必須做的谷歌原型緩衝區。
任何人都可以請建議我一些關於這些好文章或提供我這方面的幫助。
我需要設計一個套接字,它將偵聽傳入請求的端口併發送回復以響應這些請求。 這些套接字也將負責在某些事件上發送數據到端口(與上面提到的數據無關)。使用谷歌原型緩衝區發送/接收數據
這一切,我必須做的谷歌原型緩衝區。
任何人都可以請建議我一些關於這些好文章或提供我這方面的幫助。
您可以使用proto緩衝區與C++的任何網絡庫。要發送proto緩衝區,只需在您的proto緩衝區對象上調用SerializeToArray
並通過網絡發送該數組。如果您收到對象,請使用ParseFromArray
函數將您的數組反序列化回原始緩衝區對象。
升壓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_;
}
那麼,谷歌協議緩衝區真的是有據可查的自己。只需訪問https://code.google.com/p/protobuf/ – mrVoid 2014-09-12 12:37:52