Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2011, 06:04
alkareth
 
Fecha de Ingreso: mayo-2011
Mensajes: 4
Antigüedad: 13 años, 6 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.