当我在 C 中发送带有套接字的 char * 时,我收到 (null)

I receive (null) when I send a char * with sockets in C

我正在实施一个 server/client 架构,我可以发送不同的请愿书并毫无问题地接收它(使用消息结构)当我想发送一个 (char *) 时,问题就来了打印接收到的 (char *) 它打印 (null)

这里是客户端:

    char *mensajeRecibido;
    struct sockaddr_in my_addrt, intermediario;
    socklen_t size_addrt, size_addrt1;
         void funcion_thread()
        {
            while(1)
            {
                fprintf(stdout,"THREAD SUSCRIPTOR: ESPERO A QUE LLEGUE ALGUN MENSAJE \n");
                socket_mensajes = accept(socket_suscriptor,(struct sockaddr *)&intermediario,&size_addrt1);
                fprintf(stdout,"SUSCRIPTOR: ALGUIEN SE HA CONECTADO \n");
                read(socket_mensajes,mensajeRecibido,sizeof(mensajeRecibido));
                printf("EL mensaje es: %s \n", mensajeRecibido);
            }
        }

这是服务器:

int publicar(char *tema, char *mensaje)
{
  int i;
  int j;
  int socketSuscriptor;
  for(i =0; i<numeroTemas;i++)
  {
    if(strcmp(map_temas[i].tema,tema) == 0)
    {
      printf("EL NUERO DE SUSCRIPTORES AL TEMA 1 ES: %d \n",map_temas[i].numeroSuscriptores);
      for(j=0;j<map_temas[i].numeroSuscriptores;j++)
      {
        socketSuscriptor = conectarConSuscriptor(map_temas[i].suscriptores[j].address_suscriptor,map_temas[i].suscriptores[j].puerto);
        if(socketSuscriptor == -1)
        {
          return -1;
        }
        write(socketSuscriptor, mensaje,strlen(mensaje)); //Envia el mensaje a los suscriptores
      }
    }
  }
  return 0;
}

int conectarConSuscriptor(struct sockaddr_in direccion_suscriptor,int puerto)
{
  struct sockaddr_in direccion_suscriptor1;
  int socketSuscriptor;
  socketSuscriptor = socket(AF_INET,SOCK_STREAM,0);

  bzero((char*)&direccion_suscriptor1,sizeof(struct sockaddr_in));
  direccion_suscriptor1.sin_family=AF_INET;
  direccion_suscriptor1.sin_addr.s_addr=inet_addr(inet_ntoa(direccion_suscriptor.sin_addr));
  direccion_suscriptor1.sin_port=/*htonl(*/puerto/*)*/;
  printf("La direccion del suscriptor es %s \n", inet_ntoa(direccion_suscriptor.sin_addr));
  if(socketSuscriptor<0)
  {
    printf("INTERMEDIARIO: Error al crear el socket para comunicar con el cliente \n");
  }
  if(connect(socketSuscriptor, (struct sockaddr*)&direccion_suscriptor1, sizeof(struct sockaddr_in)) <0)
  {
    printf("Error al conectar con el suscriptor\n");
    printf("El error es: %s",strerror(errno));
    close(socketSuscriptor);
    return -1;
  }
  return socketSuscriptor;
}

几个问题。

char *mensajeRecibido;

这永远不会分配,使用 sizeof mensajeRecibido 只会产生 4,这几乎肯定不是您想要的。没有真正的理由在这里使用 char * 。使用数组:

char mensajeRecibido[MESSAGE_SIZE]; // where MESSAGE_SIZE is some constant

read(socket_mensajes,mensajeRecibido,sizeof(mensajeRecibido));
printf("EL mensaje es: %s \n", mensajeRecibido);

你不能假设读取成功;你不能假设你没有结束流;并且您不能假设读取已填充缓冲区。那应该是:

int count = read(socket_mensajes,mensajeRecibido,sizeof(mensajeRecibido));
if (rc > 0)
    printf("EL mensaje es: %.*s \n", count, mensajeRecibido);
else if (rc == 0)
    ; // peer disconnected
else  // rc < 0 -> error
    perror("recv");