Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Violación de segmento en sockets

Estas en el tema de Violación de segmento en sockets en el foro de C/C++ en Foros del Web. Hola gente! Recurro a vosotros un poco desesperado ya que, actualmente, estoy intentando resolver dos códigos fuente que a continuación os adjunto sobre sockets. Nótese ...
  #1 (permalink)  
Antiguo 28/05/2011, 06:04
 
Fecha de Ingreso: mayo-2011
Mensajes: 4
Antigüedad: 13 años, 5 meses
Puntos: 0
Violación de segmento en sockets

Hola gente!

Recurro a vosotros un poco desesperado ya que, actualmente, estoy intentando resolver dos códigos fuente que a continuación os adjunto sobre sockets. Nótese que estoy programando en entorno Linux.

El problema en cuestión es un aviso de violación de segmento que no sé de dónde viene. Os dejo los códigos a ver si podéis vosotros ver el fallo...

He aquí el código del proceso que actúa como servidor:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/socket.h>
  4. #include <sys/types.h>
  5. #include <errno.h>
  6. #include <netdb.h>
  7. #include <strings.h>
  8. #include <netinet/in.h>
  9. #include <string.h>
  10.  
  11. #define PUERTO 2500
  12. #define MAX 4
  13.  
  14. int main(void){
  15.   socklen_t fd1, fd2;
  16.   struct sockaddr_in sock, sock2;
  17.   char *mess="Bienvenido";  
  18.   int puto_bind, tam;
  19.  
  20.   if((fd1=socket(AF_INET, SOCK_STREAM, 0))==-1){
  21.     perror("socket");
  22.     exit(EXIT_FAILURE);
  23.   }
  24.  
  25.   sock.sin_family=AF_INET;
  26.   sock.sin_port=htons(PUERTO);
  27.   sock.sin_addr.s_addr=inet_addr("127.0.0.1");
  28.   bzero(&(sock.sin_zero), sizeof(sock));
  29.  
  30.   puto_bind=bind(fd1, (struct sockaddr *)&sock, sizeof(sock));
  31.   if(puto_bind==-1){
  32.     perror("bind");
  33.     exit(EXIT_FAILURE);
  34.   }
  35.  
  36.   if(listen(fd1, MAX)==-1){
  37.     perror("listen");
  38.     exit(EXIT_FAILURE);
  39.   }
  40.  
  41.   while(1){
  42.     tam=sizeof(sock2);
  43.     if((fd2=accept(fd1, (struct sockaddr *)&fd2, &tam))==-1){
  44.       perror("accept");
  45.       exit(EXIT_FAILURE);
  46.     }
  47.    
  48.     printf("\nSe ha conectado al servidor.");
  49.     inet_ntoa(sock2.sin_addr.s_addr);
  50.     send(fd2, mess, strlen(mess), 0);
  51.     close(fd2);
  52.   }
  53.   close(fd1);
  54.   exit(EXIT_SUCCESS);
  55. }

Y aquí el código del proceso que actúa como cliente:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/socket.h>
  4. #include <sys/types.h>
  5. #include <errno.h>
  6. #include <netdb.h>
  7. #include <strings.h>
  8. #include <netinet/in.h>
  9.  
  10. #define PUERTO 2500
  11.  
  12. int main(void){
  13.   socklen_t fd;
  14.   int num;
  15.   char *buffer;
  16.   struct sockaddr_in sock;
  17.  
  18.   if((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){
  19.     perror("socket()");
  20.     exit(EXIT_FAILURE);
  21.   }
  22.  
  23.   sock.sin_family=AF_INET;
  24.   sock.sin_port=htons(PUERTO);
  25.   sock.sin_addr.s_addr=inet_addr("127.0.0.1");
  26.   bzero(&(sock.sin_zero), sizeof(sock));
  27.  
  28.   if(connect(fd, (struct sockaddr *)&sock, sizeof(sock))==-1){
  29.     perror("connect()");
  30.     exit(EXIT_FAILURE);
  31.   }
  32.  
  33.   if((num=recv(fd, buffer, 1024, 0))==-1){
  34.     perror("recv");
  35.     exit(EXIT_FAILURE);
  36.   }
  37.  
  38.   buffer[num]='\0';
  39.   printf("\nInformación recibida del servidor %s\n", buffer);
  40.   close(fd);
  41. }

Un abrazo.

P. D: Por si hay dudas, estoy intentando mandar una cadena que contiene un mensaje desde el servidor hasta el cliente y que este último la muestre por pantalla.
  #2 (permalink)  
Antiguo 28/05/2011, 06:11
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Violación de segmento en sockets

¿Puedes especificar en que línea te da el error de violación de segmento?

Si no lo mejor sería que usases el depurador gdb o incluso uno gráfico con el ddd para ver en que lugar te está dando el fallo.
  #3 (permalink)  
Antiguo 28/05/2011, 06:13
 
Fecha de Ingreso: mayo-2011
Mensajes: 4
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Violación de segmento en sockets

No me especifica la línea en la que me da violación de segmento... simplemente me salta ese mensaje, en cuanto a lo del depurador, lo tendré en cuenta porque ya ando medio mosca con el código a ver si consigo dar con el problema.
  #4 (permalink)  
Antiguo 28/05/2011, 06:16
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Violación de segmento en sockets

Ya te digo yo donde puede estar el error.

Has definido la variable buffer como char *, eso define un puntero. Necesitas realizar una asignación de memoria (con malloc) y luego liberarla con free, o utilizar una cadena estática (char buffer[50]).
  #5 (permalink)  
Antiguo 28/05/2011, 06:20
 
Fecha de Ingreso: mayo-2011
Mensajes: 4
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Violación de segmento en sockets

Durante la tarde intentaré hacer lo que me has recomendado y ya te comento si me funciona.

Gracias!!
  #6 (permalink)  
Antiguo 28/05/2011, 09:32
 
Fecha de Ingreso: mayo-2011
Mensajes: 4
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Violación de segmento en sockets

¡Solucionado! Solamente he tenido que asignar un tamaño a la cadena buffer para que no hubiera problemas. No ha hecho falta ni tan siquiera utilizar malloc.

Saludos y gracias!!

Etiquetas: linux, segmento, socket, violación
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:11.