Получение segfault из-за строковой переменной типа данных на сервере PROTOBUF и связи клиента через сокеты на конце recv в c - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в протобуфе

Когда я отправляю переменную protobuf через соединение через сокет на recv end, я пытаюсь отобразить строковую переменную protobuf. Я получил сегментацию в этом оставшемся типе данных, кроме String, они работают нормально, но в случае строковой переменной я получил сегментацию Как можно Я перешел к ошибке сегментации типа данных строки Protobuf, за исключением того, что у нас есть какой-либо другой тип данных для хранения типа данных строки.

Я создаю proto_socket.proto с именем строковой переменной. Там я компилирую proto_socket.proto с компилятором protoc (protoc proto_socket.proto --c_out <path>), он создает два файла, два файла proto_socket.pb-c.h, proto_socket.pb-c.c. Используя эти файлы, я создаю proto_server.c и proto_client.c. И скомпилируйте это. но во время выполнения обеих программ я отправил переменную protobuf на стороне recv, которая выдает ошибку сегментации из-за попытки отобразить строковую переменную.

proto_socket.proto

syntax="proto2";
message messages{
   optional int32 age=1;
   optional int32 year=2;
   optional string name=3;
}

созданная структура для .proto

struct  _Messages
{
   ProtobufCMessage base;
   protobuf_c_boolean has_age;
   int32_t age;
   protobuf_c_boolean has_year;
   int32_t year;
   char *name;
};

proto_client.c

 void *clientThread(void *arg)
 {
   Messages t_message;
  //while(1)
  {
  int32_t s32_send_status;
  t_message.age =70;
  t_message.year=2018;
  t_message.name="anu";

    s32_send_status=send(gs32_clientSocket ,(unsigned char *)
            (&t_message),sizeof(t_message) ,0);
    if(s32_send_status>0){
        printf("data send to server.\n");
    }
    else{
        printf("failed to send data to server\n");
    }
    /*gs32_valread=read( gs32_clientSocket , gars32_buffer , 1024);
    if(gs32_valread==0){
        printf("connection loss\n");
        exit(1);
    }
    else if(gs32_valread<0){
        printf("error:read\n");
        exit(1);
    }
    else{
        printf("server replay:%s\n",gars32_buffer);
    }*/
}
sleep(2);
return NULL;
}

proto_server.c

void *socketThread(void *arg)
{

Messages t_message;

//while(1)
{
    gs32_valread = read( gs32_new_socket,(unsigned char *)
            (&t_message), 1024);
    if(gs32_valread==0){
         printf("disconnected\n");
         exit(1);
    }
    else if(gs32_valread<0){
         printf("error\n");
         exit(1);
    }
    else{
        printf("age=%d\n",t_message.age );
        printf("year=%d\n",t_message.year);
        gs32_birth_year=(t_message.year)-(t_message.age);
        printf("birth year=%d\n",gs32_birth_year);
        printf("name=%s\n",t_message.name);
    }
    sleep(1);
    close(gs32_new_socket);
}
return NULL;
}

и результат

age=70
year=2018
birth year=1948
Segmentation fault (core dumped)
...