我正在实现一个服务器/客户端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;
}
答案 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");