erlang和C++通信使用protobuf

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include <iostream>
#include <memory>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/message.h>
#include "test.pb.h"
#define MAXLINE 4096

typedef std::shared_ptr<google::protobuf::Message> MessagePtr;

google::protobuf::Message* createMessage(const std::string& typeName)
{
  google::protobuf::Message* message = NULL;
  const google::protobuf::Descriptor* descriptor =
    google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
  if (descriptor)
  {
    const google::protobuf::Message* prototype =
      google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
    if (prototype)
    {
      message = prototype->New();
    }
  }
  return message;
}

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr;
    char    buff[4096];
    int     n;

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(9001);

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    if( listen(listenfd, 10) == -1){
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

    printf("======waiting for client's request======\n");
    while(1){
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
        continue;
    }
    n = recv(connfd, buff, MAXLINE, 0);
	google::protobuf::Message* message;
	std::string typeName = "Query";
	std::cout <<"aaa" << std::endl;
	message = createMessage(typeName);
	std::cout <<"bbb" << std::endl;
	const char* data = buff;
	if (message)
		message->ParseFromArray(data,12);
	else
		std::cout << "error" << std::endl;
	std::cout <<"ccc" << std::endl;
	std::cout << message->GetTypeName() << std::endl;
	Query* query = (Query*)message;
	std::cout << query->id() << std::endl;
	std::cout << query->questioner() << std::endl;
	std::cout << query->question() << std::endl;
	Query query2;
	query2.set_id(1);
	query2.set_question("abc");
	query2.set_questioner("edg");
	int byte_size= query2.ByteSize();
	char buf[byte_size];
	uint8_t* start = reinterpret_cast<uint8_t*>(buf);
	uint8_t* end = query2.SerializeWithCachedSizesToArray(start);
	/*message = (google::protobuf::Message*)query;
	std::cout <<"ddd" << std::endl;
	int byte_size = message->ByteSize();
	std::cout <<"eee" << std::endl;
	uint8_t* start = reinterpret_cast<uint8_t*>(des);
	std::cout <<"fff" << std::endl;
	message->SerializeWithCachedSizesToArray(start);
	std::cout <<"ggg" << std::endl;*/
	write(connfd,start,byte_size);
	std::cout <<"send" << std::endl;
    //buff[n] = '\0';
    //printf("recv msg from client: %s\n", buff);
    close(connfd);
    }

    close(listenfd);
}



C++做服务端,g++ -o test test.cpp test.pb.cc -std=c++11 -lprotobuf

-module(test).  
  
-compile([export_all]).  
  
-include("test_pb.hrl").  
  
encode() ->  
    Person = #person{age=true, name="John"},  
    test_pb:encode_person(Person).  
  
decode() ->  
    Data = encode(),  
    test_pb:decode_person(Data).  
  
encode_repeat() ->  
    RepeatData =  
    [  
        #person{age=true, name="John"},  
        #person{age=true, name="Lucy"},  
        #person{age=false, name="Tony"}  
    ],  
    Family = #family{person=RepeatData},  
    test_pb:encode_family(Family).  
      
decode_repeat() ->  
    Data = encode_repeat(),  
    test_pb:decode_family(Data). 

test() ->
	io:format("encode ~p~n", [encode()]),
	io:format("decode ~p~n", [decode()]),
	io:format("encode_repeat ~p~n", [encode_repeat()]),
	io:format("decode_repeat ~p~n", [decode_repeat()]),
	ok.

encode2() ->
    Query = #query{id=2,questioner="abc",question="ebf"},
    test_pb:encode_query(Query).

decode2() ->
    Data = encode2(),
    test_pb:decode_query(Data).

test2() ->
    {ok, Socket} = gen_tcp:connect("192.168.180.129", 9001, [binary, {packet, 0}, {active, false}]),
    io:format("Socket=~w~n",[Socket]),
	Data = encode2(),
	io:format("Bin111=~w~n",[Data]),
	Data2 = test_pb:decode_query(Data),
	io:format("Data2 = ~w~n",[Data2]),
	gen_tcp:send(Socket,Data),
	case gen_tcp:recv(Socket,0) of
		{ok,Bin} ->
			io:format("Bin=~w~n",[Bin]);
		_ ->
			skip
	end,
    %%io:format("encode2 ~p~n", [encode2()]),
    %%io:format("decode2 ~p~n", [decode2()]),
    ok.

test3() ->
	{ok,ListenSock} = gen_tcp:listen(9001,[binary,{packet,0}, {active, false}]),
	{ok,Socket} = gen_tcp:accept(ListenSock),
	case gen_tcp:recv(Socket,0) of
		{ok,Bin} ->
			io:format("Bin222=~w~n",[Bin]),
			Data = test_pb:decode_query(Bin),
			io:format("Data = ~w~n",[Data]),
			gen_tcp:send(Socket,Bin);
		_ -> skip
	end,
	ok.

test4() ->
    {ok, Socket} = gen_tcp:connect("192.168.180.129", 9001, [binary, {packet, 0}, {active, false}]),
	io:format("encode2=~w~n",[encode2()]),
	gen_tcp:send(Socket,encode2()),
	{ok,Bin}=gen_tcp:recv(Socket,0),
	%%receive
	%%	{tcp,Socket,Bin} ->
		%%			Data = test_pb:decode_query(Bin),
	%%		io:format("Data=~w~n",[Data]);
	%%	Error ->
	%%		io:format("Error=~w~n",[Error])
	%%end,
	Data = test_pb:decode_query(Bin),
	io:format("Data=~w~n",[Data]),
	%%gen_tcp:send(Socket,<<"abcfeg">>),
	%gen_tcp:send(Socket,<<"100250">>),
	%timer:sleep(100),
	%gen_tcp:send(Socket,<<"fsdfds">>),
	%gen_tcp:send(Socket,<<"10efs">>),
	%gen_tcp:send(Socket,<<"fafa100">>),
	ok.

test5() ->
	{ok,ListenSock} = gen_tcp:listen(9001,[binary,{packet,0}, {active, false}]),
	 {ok,Socket} = gen_tcp:accept(ListenSock),
	 {ok,Bin} = gen_tcp:recv(Socket,0),
	 io:format("Bin=~p~n",[erlang:binary_to_term(Bin)]),
	 ok.

	 
    

erlang做客户端

message Person {  
  required bool age = 1[default=true];  
  required string name = 2;  
}  
  
message Family {  
  repeated Person person = 1;  
}

message People {
    required string name = 1;
    required string address = 2;
    required string phone_number = 3;
    required int64 age = 4;
}

message Query {
    required int64 id = 1;
    required string questioner = 2;
    required string question = 3;
}

 

参考:https://blog.csdn.net/Shreck66/article/details/50926276

https://www.cnblogs.com/jadeshu/p/10663694.html

https://www.cnblogs.com/yh-totoro/p/4606157.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值