当我通过 recv 端的套接字通信发送 protobuf 变量时,我试图显示 protobuf 的字符串变量,我在这个剩余的数据类型中得到了分段,而不是字符串,它们工作正常,但是字符串变量的情况下我得到了分段我怎么能过来在 Protobuf 字符串数据类型分段错误中,除了我们有任何其他数据类型用于存储字符串数据类型。
我用字符串变量名创建了一个 example.proto 我正在用 protoc 编译器(protoc example.proto --cpp_out <path>
)编译 example.proto 它创建两个文件两个文件 example.pb.h、example.pb.cc 通过使用这些文件我创建了一个 test_server。 cpp 和 test_client.cpp 并编译它。但是在两个程序运行时,我在 recv 端发送了一个 protobuf 变量,由于尝试显示字符串变量,它给出了分段错误。
我怎么解决这个问题?
例子.proto
package data;
message star
{ optional string name=1; }
服务器.cpp
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
#include<string.h>
#include <arpa/inet.h>
#include"example.pb.h"
#include"example.pb.cc"
int main()
{
int sd,csd;
sd=socket(AF_INET, SOCK_STREAM,0);
perror("socket");
sockaddr_in ser,cli;
ser.sin_family=AF_INET;
ser.sin_port=htons(7878);
ser.sin_addr.s_addr=inet_addr("X.Y.Z.A");
bzero(ser.sin_zero, 8);
size_t s=16;
if(bind(sd,(struct sockaddr *)&ser, s)==-1)
cout<<"Bind FAIL\n";
else
cout<<"Bind Success\n";
if((csd=accept(sd,(struct sockaddr *)&cli, &s))==-1)
cout<<"Connection Accept FAIL\n";
else
cout<<"ConnectioN Accept Success\n";
star pkt;
recv(csd,&pkt,sizeof(pkt),0);
cout<<"\t String Name: "<<pkt.name<<endl; //Here only i get segmentation
close(sd);
close(csd);
}
客户端.cpp
#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
#include<string.h>
#include <arpa/inet.h>
#include"example.pb.h"
#include"example.pb.cc"
int main()
{
int sd;
sd=socket(AF_INET, SOCK_STREAM,0);
perror("socket");
sockaddr_in ser;
ser.sin_family=AF_INET;
ser.sin_port=htons(7878);
ser.sin_addr.s_addr=inet_addr("X.Y.Z.A");
bzero(ser.sin_zero, 8);
if(connect(sd,(struct sockaddr *)&ser, 16)==-1)
cout<<"connect FAIL\n";
else
cout<<"connect Success\n";
star pkt;
pkt.set_name("Pratap");
cout<<"Send Data without help of another variable....\n";
send(sd,&pkt,sizeof(pkt) ,MSG_CONFIRM);
close(sd);
}