elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Violación de segmento en sockets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Violación de segmento en sockets  (Leído 3,817 veces)
e

Desconectado Desconectado

Mensajes: 177


e


Ver Perfil
Violación de segmento en sockets
« en: 16 Julio 2018, 10:39 am »

Hola,  :D
He ido a iniciar un pequeño socket en C++, me ha dado un mensaje de error en el que decía:
Citar
Violación de segmento
.
La línea en la que me da el error pone lo siguiente:
Citar
packet_socket = socket(AF_INET, SOCK_STREAM, 0);
Gracias,  :D
fox459


En línea

e
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #1 en: 16 Julio 2018, 10:59 am »

Hola,  :D
He ido a iniciar un pequeño socket en C++, me ha dado un mensaje de error en el que decía:.
La línea en la que me da el error pone lo siguiente:Gracias,  :D
fox459

Repasa el prototipo de la llamada socket.
Código:
NAME
       socket - create an endpoint for communication

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

basta con que declares
Código
  1. int packet_socket;
  2. packet_socket = socket(AF_INET, SOCK_STREAM, 0);

Probablemente tengas mal declarado packet_socket y esté apuntando a alguna dirección sin sentido como por ejemplo;

Código
  1. int *packet_socket; // uninitialized pointer
  2. packet_socket = socket(AF_INET, SOCK_STREAM, 0);


En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
e

Desconectado Desconectado

Mensajes: 177


e


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #2 en: 16 Julio 2018, 13:13 pm »

No,  :-\
Solo tengo dos líneas para lo de los sockets.
int packet_socket;
packet_socket = socket(AF_INET, SOCK_STREAM, 0);
Gracias,   :-*
fox459
En línea

e
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #3 en: 16 Julio 2018, 16:19 pm »

No es posible. Un programa tan simple....
El error debe estar en las otras cosas...las que no son de sockets

Código
  1. #include <sys/types.h>        
  2. #include <sys/socket.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6.  
  7. int main()
  8. {
  9.  int packet_socket;
  10.  if ((packet_socket = socket(AF_INET, SOCK_STREAM, 0))==-1)
  11.    {
  12.      perror("socket");
  13.      exit(1);
  14.    }
  15.  
  16.  if (close(packet_socket)==-1)
  17.    {
  18.      perror("close");
  19.      exit(1);
  20.    }
  21.  exit(0);
  22. }
  23.  

Probando esto en UNIX

Código:
(./main && echo "OK") || echo "NOK"

Da la salida
Código:
OK
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
e

Desconectado Desconectado

Mensajes: 177


e


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #4 en: 16 Julio 2018, 17:40 pm »

Seguramente, ese código me ha ido, el código completo está en https://github.com/wallyandwaldo/bar/blob/master/bar.cpp
Gracias,  :-*
fox459
En línea

e
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #5 en: 16 Julio 2018, 21:16 pm »

usa la depuración de tu ide y ve donde se quiebra tu programa
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
e

Desconectado Desconectado

Mensajes: 177


e


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #6 en: 17 Julio 2018, 10:31 am »

Gracias por las respuestas,
pero he hecho la prueba de ponerlo fuera de cualquier función y no me da Violación de segmento :huh:.
Gracias,
fox459
En línea

e
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Violación de segmento en sockets
« Respuesta #7 en: 17 Julio 2018, 16:09 pm »

Mirando el codigo que publicaste en github, no pareces estar usando socket() para nada en realidad. Si eliminas la invocacion de socket tu programa se deberia comportar igual.

Aprovechando, elimina variables que definiste y no usas. Hay varias.

Opino que tu programa se va a comportar mal igual despues. Incluso sin la presencia de socket(), pues ademas estas usando variables sin inicializar.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
e

Desconectado Desconectado

Mensajes: 177


e


Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #8 en: 17 Julio 2018, 17:02 pm »

Mi programa aún está sumido en el caos, sin perfeccionar, etc.
Pero gracias,  :-*
fox459
En línea

e
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Violación de segmento en sockets
« Respuesta #9 en: 17 Julio 2018, 19:39 pm »

A ver, muchas cosas.
¿Estás usando C++ para compilar C?

En C no hay valores por defecto en los argumentos, así que esto
Código:
int generateRandom(int number = '1'){
está mal.

C no tiene el tipo de dato bool por defecto (tampoco false ni true), hay que incluir la librería stdbool para ello.

Inicializar cadenas:
Código:
char lxr[101];
strcat(lxr, "/home/");
strcat(lxr, user);
strcat(lxr, "/");
strcat(lxr, "readme.txt");
Todo esto se puede sustituir por una familia función de la familia printf:
Código:
char lxr[101];
sprintf(lxr, "/home/%s/readme.txt);
Por otra parte
Código:
// Global
char boot[21];
// ...
// Local en una función
strcat(boot, "/");
strcat(boot, "etc");
strcat(boot, "/");
strcat(boot, "rc.d");
strcat(boot, "/");
strcat(boot, "rc.local");
Podrías cambiarlo por
Código:
strcpy(boot, "/etc/rc.d/rc.local");
Y así reducir el tamaño del código y quede mejor a la vista. Aparte de que no pasas tanto tiempo llamando a funciones. Fíjate que que he hecho strcpy y no strcat porque aquí te salvas porque las cadenas globales se inicializan a 0. Pero si fuera una local o ya tuviera algo dentro copiaría la dirección al final de lo que hubiera causando un fallo. Usando esta técnica de strcat sucesivos asegúrate que el primero sea un strcpy.
De todas formas como sólo vas a usar esa variable de forma local puedes inicializar la variable de esta forma:
Código:
char boot[21] = "/etc/rc.d/rc.local";
Aunque también usando la característica de que en definiciones C te calcula el tamaño del array
Código:
char boot[] = "/etc/rc.d/rc.local";
Y apurando un poco más, ya que estás trabajando con una cadena literal y no vas a modificarla puedes dársela directamente a un puntero
Código:
char* boot = "/etc/rc.d/rc.local";

Código redundante:
Código:
if(remove(lxr) == 0){
    remove(lxr);
}
En el if ya has llamado a remove y dices que si ha tenido éxito en borrar lo llame otra vez.

Arrays de punteros:
Código:
void wn(void){
    char *path[432];
    strcat(*path, "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\");
}
Así no puedes construir una cadena porque cada elemento del array son punteros a char, no son char. Esto te podría dar fallos multiorgásmicos (palabro intencionado :D).

Comparar cadenas:
Código:
if (OS == "Linux"){
    lx();
}
else if (OS == "Windows"){
    wn();
}
else if (OS == "Mac"){
    mc();
}

El == no compara cadenas tipo C. Pero aquí te salvas por una característica de C: todas las cadenas literales iguales tienen una única copia en memoria y todas sus apariciones en el código apuntan al mismo sitio, así C ahorra memoria (y esta es la causa por la que una cadena literal no puede ser modificada). Por tanto si comparas dos cadenas literales, dos punteros que hayan sido definidos con la misma cadena o un de estos punteros con la misma cadena literal C devolverá cierto.
« Última modificación: 17 Julio 2018, 19:53 pm por MAFUS » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con violación de segmento « 1 2 »
Programación C/C++
Triper0 17 16,506 Último mensaje 8 Noviembre 2015, 21:34 pm
por alesurf1989
ayuda violacion de segmento?
Programación General
nightcode 7 3,986 Último mensaje 31 Diciembre 2013, 18:32 pm
por nightcode
Violación de Segmento
Programación C/C++
Jaquieline_JJ 1 2,057 Último mensaje 24 Abril 2014, 04:11 am
por engel lex
Violacion segmento en C Linux
Programación C/C++
Xin_J.D 2 2,292 Último mensaje 31 Marzo 2018, 00:33 am
por BloodSharp
Violación de segmento de código en c++ (sin punteros)
Programación C/C++
juligarc10 9 2,432 Último mensaje 11 Noviembre 2018, 21:42 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines