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

时间:2015-02-26 22:30:52

标签: c sockets client server

我正在实现一个服务器/客户端arquitecture,我可以发送不同的请求并接收它没有问题(使用消息结构)问题变成当我想在打印收到时发送单个(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;
}

1 个答案:

答案 0 :(得分:0)

有几个问题。

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");