zoukankan      html  css  js  c++  java
  • Sword protobuf学习三

    #include <iostream>
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    #include "test.pb.h"   /* 这是proto文件生成的头文件 */
    
    #include "include/google/protobuf/map.h"/* protobuf提供的map数据结构 */
    
    using namespace std;
    
    int connect_server()
    {
        int fd = 0;
        struct sockaddr_in addr;
        int len = 0;
        char *pcData = NULL;
        long fileSize = 0;
    
        fd = socket(AF_INET, SOCK_STREAM, 0);
        if (fd < 0)
        {
            printf("socket() failed .
    ");
            return -1;
        }
    
        memset(&addr, 0, sizeof(struct sockaddr_in));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(8888);
        addr.sin_addr.s_addr = inet_addr("127.0.0.1");
        if (connect(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)))
        {
            printf("connect() failed .
    ");
            return -1;
        }
    
        commun::Say msg;
        
        //基本类型参数的赋值
        msg.set_code(13);    //数值型
        msg.set_data("this is the last chance, go ,do not hesitate .
    ");  //字符串类型
    
        //读一个音频文件
        readAudio("../audio/test.wav", &pcData,&fileSize);
        //非字符串型字符数据赋值(例如音频文件)
        //注意需要加size,不然传过去就是字符串,字符串是以0结尾的
        msg.set_audio(pcData, fileSize);
        msg.set_filesize(fileSize);
    
        //数组类型参数的赋值--proto文件中repeated修饰的变量
        msg.add_name("feng");
        msg.add_name("yu");
        msg.add_name("lei");
        msg.add_name("dian");
    
        //map类型参数的赋值
        using MapPair = google::protobuf::MapPair<google::protobuf::int32, string>;
    
        msg.mutable_projects()->insert(MapPair(0, "tom"));
        msg.mutable_projects()->insert(MapPair(1, "jack"));
        msg.mutable_projects()->insert(MapPair(2, "dong"));
    
    
        len = htonl(msg.ByteSize());
    
        //msg.ByteSize()获取消息结构的大小
        char *buffer = (char *)malloc(msg.ByteSize()+4);
        memset(buffer, 0, msg.ByteSize() + 4);
        //存放消息结构的大小
        memcpy(buffer, &len, sizeof(int));
        //将消息msg序列化到buffer中
        //也可以使用SerializeToString()函数来序列化字符串,但是估计没啥应用场景
        //ParseFromString()反序列化字符串
        //ParseFromArray()反序列化字符数组
        msg.SerializeToArray(buffer + 4, msg.ByteSize());
    
        send(fd, buffer, msg.ByteSize()+4, 0);
    
        free(buffer);
    
        sleep(30);
    
        close(fd);
    
        return 0;
    
    }
  • 相关阅读:
    Inno Setup命令行安装卸载参数
    Fragment生命周期
    ubuntu 64位系统下加速Android模拟器
    Java中对SQLite数据库操作 操作db文件
    系统权限管理设计
    java 中的序列化是什么意思?有什么好处?
    js实现定时调用的函数setInterval()
    tomcat 并发配置优化
    centOS下 JDK的三种安装方式
    Linux 配置静态Ip地址
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/9689581.html
Copyright © 2011-2022 走看看