使用protobuf和socket实现服务器间消息的传递_protobuf socket,物联网嵌入式开发开发面试

60 阅读2分钟

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

CC = g++ -g -D\_\_LINUX\_\_ -Wall -fPIC
AR = ar -r

PROJ_LIB = libTest.a
PROJ_OBJ = Test.pb.o

all:$(PROJ_LIB) 

prepare:
    protoc -I=./  --cpp_out=./  Test.proto

$(PROJ_LIB):$(PROJ_OBJ)
    $(AR) $(PROJ_LIB) $(PROJ_OBJ)

.cc.o:
    $(CC) -c $< -o $@

clean:
    rm -f \*.o
    rm -f Test.pb.\*

执行 make prepare,生成Test.proto对应的Test.pb.h和Test.pb.cc
执行make生成将生成的文件编译后并打包成libTest.a

其次,使用protobuf和socket进行双向通信的代码:
client端代码:

#include <iostream>
#include <string>
#include <ctime>
//for protobuf
#include "Test.pb.h" 
//for socket
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;
using namespace Test::protobuf ;

const int BUFFSIZE = 128;
int main()
{
    //建立socket
    int socketfd ;
    struct sockaddr_in seraddr ;
    string hostip = "127.0.0.1";
    //链接,尝试3次
    for(int i = 0 ; i < 3;++i)
    {
        if((socketfd = socket(AF_INET,SOCK_STREAM,0)) > 0)
        {
            cout<<"create socket success..."<<endl;
            break;
        }
        sleep(2);
    }
    //地址置空
    bzero( &seraddr, sizeof(seraddr) );
    //
    seraddr.sin_family = AF_INET ;
    seraddr.sin_port = htons(9999);
    seraddr.sin_addr.s_addr = inet_addr(hostip.c_str());
    //尝试连接到服务端地址
    if(connect(socketfd,(struct sockaddr *)&seraddr, sizeof(seraddr)) < 0)
    {
        cout<<"connect to server failed ..."<<endl;
        close(socketfd);
        return -1;
    }

    HeartInfo myprotobuf;
    while(1)
    {
        int curtime = time(NULL) ;
        //以下方法的实现可以Test.pb.h中找到
        myprotobuf.set_curtime(curtime);
        myprotobuf.set_hostip("127.0.0.1");
        //protobuf的序列化方式之一
        char buff[BUFFSIZE];
        myprotobuf.SerializeToArray(buff,BUFFSIZE);

        if(send(socketfd,buff,strlen(buff),0) < 0)
        {
            cout<<curtime<<": send failed ..."<<endl;
            break;
        }
        cout<<curtime<<": send success ..."<<endl;
        sleep(5); //每隔5s发送一次
    }
    close(socketfd);
    return 0;
}

server端代码

#include <iostream>
#include <string>
#include <ctime>
//for protobuf
#include "Test.pb.h" 
//for socket
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>

using namespace std;
using namespace Test::protobuf ;

const int BUFFSIZE = 128;
const int QLEN = 10 ;

int main()
{

    int listenfd ;
    int connfd ;
    struct sockaddr_in seraddr ;
    //建立socket
    //AF\_INET:IPv4因特网域
    //SOCK\_STREAM:TCP链接
    //0:给定前两个参数,选择默认的协议
    listenfd = socket(AF_INET,SOCK_STREAM,0);
    if(listenfd < 0 )
    {
        cout<<"socket failed"<<endl;
    }
    //地址置空
    bzero(&seraddr,sizeof(seraddr));
    //
    seraddr.sin_family = AF_INET ;
    seraddr.sin_port = htons(9999);
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    //关联地址和套接字
    if(bind(listenfd,(struct sockaddr *)&seraddr, sizeof(seraddr)) < 0)
    {
        cout<<"bind address with socket failed..."<<endl;
        close(listenfd);
        return -1;
    }
    //调用listen,宣告server愿意接受链接请求
    if(listen(listenfd,QLEN) == -1)
    {
        cout<<"listen on socket failed..."<<endl;
        close(listenfd);
        return -1;
    }
    //获得连接请求,并建立连接
    if( (connfd = accept(listenfd,(struct sockaddr *)NULL,NULL)) < 0 )
    {
        cout<<"accept the request failed"<<endl;
        close(listenfd);
        return -1;
    }
    HeartInfo myprotobuf;
    char buff[BUFFSIZE];
    while(1)
    {
        if(recv(connfd,buff,sizeof(buff),0) < 0)
        {
            cout<<"recv failed ..."<<endl;
            break;
        }
        //protobuf反序列化
        myprotobuf.ParseFromArray(buff,BUFFSIZE);
        cout<<"last heart time:"<<myprotobuf.curtime()<<"\t"
            <<"host ip:"<<myprotobuf.hostip()<<endl;


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2d0316959b5349c794612446c593b4ff~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1772525997&x-signature=N5Lse0hJSB9JFv0iTXhWYRrdo%2Bo%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fb44de7607c24437b6865c93d06917da~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1772525997&x-signature=eGApfRSZpWg3dREKAdtCL%2Bo1RG8%3D)

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**