Abrufen eines Segfault aufgrund einer Zeichenfolge-Datentypvariablen in der PROTOBUF-Server- und -Client-Kommunikation über Sockets bei Empfang und in cpp

Wenn ich eine Protobuf-Variable über die Socket-Kommunikation am Ende des Empfangs sende, versuche ich, die String-Variable von Protobuf anzuzeigen. Ich habe Segmentierung in diesem verbleibenden Datentyp In Protobuf String Datentyp Segmentierungsfehler haben wir keinen anderen Datentyp zum Speichern des String-Datentyps.

Ich erstelle eine example.proto mit im String Variablenname, da ich example.proto mit protoc Compiler kompiliere (protoc example.proto --cpp_out <path>) es werden zwei Dateien erstellt zwei Dateien example.pb.h, example.pb.cc Mit diesen Dateien erstelle ich einen test_server.cpp und einen test_client.cpp und kompiliere ihn. Zum Zeitpunkt der Ausführung beider Programme habe ich jedoch eine protobuf-Variable auf der recv-Seite gesendet, die aufgrund des Versuchs, eine Zeichenfolgenvariable anzuzeigen, einen Segmentierungsfehler verursacht.

Wie kann ich dieses Problem lösen?

example.proto

package data;
message  star
{ optional string name=1; }

server.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);
}

client.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);
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage