#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