C/Visual C - problemas de core dumped

   
Vista:

problemas de core dumped

Publicado por jose (2 intervenciones) el 27/12/2007 19:49:24
haber tengo un problemilla con el siguiente programa ke me da core dumped

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <netdb.h>
#include "transporte.h"


struct sockaddr_in servidor_tcp;
struct sockaddr_in servidor_udp;
struct sockaddr_in clientes;

int serv_tcp(int s, int lstcp);
char* juego(char *datos_recibir);
void serv_udp(int s);
int crearSocket (TPDU tpdu, int rol);

int main(int argc, char *argv[])
{
int lstcp=0;
int lsudp=0;
int addrlen=0;
int mayor=0;
int dev=0;
const char TCP[3]="TCP";
const char UDP[3]="UDP";
int s;
fd_set fd_sockets;
TPDU tpdu1;
TPDU tpdu2;

memset((char *)&servidor_tcp,0, sizeof(struct sockaddr_in));
memset((char *)&clientes, 0,sizeof(struct sockaddr_in));
memset((char *)&servidor_udp,0,sizeof(struct sockaddr_in));

/*configuro el servidor TCP*/
servidor_tcp.sin_family = AF_INET; /*IP v4*/
servidor_tcp.sin_addr.s_addr = INADDR_ANY; /*direccion IP propia*/
servidor_tcp.sin_port =2968;

/*configuro el servidor UDP*/
servidor_udp.sin_family=AF_INET;
servidor_udp.sin_addr.s_addr=INADDR_ANY;
servidor_udp.sin_port=2969;

if(argc<1)
return 0;


if(strcmp(argv[1],TCP)) {

tpdu1.tipo=IPPROTO_TCP;
/*tpdu1.dir_ip=INADDR_ANY;*/
tpdu1.puerto=servidor_tcp.sin_port;
lstcp=crearSocket(tpdu1,1);

}

if(strcmp(argv[1], UDP)) {
tpdu1.tipo=IPPROTO_UDP;
/*tpdu2.dir_ip=INADDR_ANY;*/
tpdu2.puerto=servidor_udp.sin_port;
lsudp=crearSocket(tpdu2,1);
}

setpgrp();

switch(fork())
{
case -1: printf("ERROR");

case 0: close(stdin);
close(stdout);
signal(SIGCLD, SIG_IGN);
for( ; ; )
{
FD_ZERO(&fd_sockets);
FD_SET(lsudp,&fd_sockets);
FD_SET(lstcp,&fd_sockets);

if(lsudp>lstcp)
mayor=lsudp;
else
mayor=lstcp;

mayor=mayor+1;

dev=select(mayor, &fd_sockets, NULL, NULL, NULL);
if(dev==-1) printf("ERROR");

if(FD_ISSET(lstcp,&fd_sockets))
{
addrlen=sizeof(struct sockaddr_in);
s = accept(lstcp, (struct sockaddr*)&clientes, &addrlen);
switch(fork())
{
case -1: printf("PERROR");
case 0: serv_tcp(s, lstcp);
default: close(s);
}
}
else { if(FD_ISSET(lsudp, &fd_sockets))
{
switch(fork())
{
case 0: serv_udp(lsudp);
case -1: printf("ERROR");
default: break;
}
}
}
}
default: return 0;

}
}

int serv_tcp(int s, int lstcp)
{
long timevar; /* contains time returned by time() */
char *ctime();
char *hostname=NULL;
char *inet_ntoa();
struct linger linger;
char datos_inicio[100]={'T','i','e','n','e','s','','q','u','e','','a','d','i','v','n','a','r','','u','n','','n','u','m','e','r','0','.','T','i','e','n','e','s','','5','','i','n','t','e','n','t','o','s',''};
char datos_recibir[20];
char *datos_enviar=NULL;
FILE *fich=NULL;

struct hostent *hp; /*nose si ponerla global o no*/

hp=gethostbyaddr((char*)&clientes.sin_addr, sizeof(struct sockaddr_in), clientes.sin_family);

if(hp==NULL)
{
hostname=inet_ntoa(clientes.sin_addr);
}
else
hostname=hp->h_name;

time (&timevar);

fich=fopen("conexiones.log","a+");

fprintf(fich,"Hostname %s ", hostname);
fprintf(fich,"PROTOCOLO TCP ", hostname);
fprintf(fich,"InternetAdd %s ", inet_ntoa(clientes.sin_addr));
fprintf(fich,"nºpuerto %d", clientes.sin_port);
fprintf(fich,"hora %s", asctime(localtime(&timevar)));

fclose(fich);
close(lstcp);

setsockopt(s, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));

if(send(s,datos_inicio,sizeof(char)*50,0)==-1)

{

perror("send");

return 1;

}

for( ; ; ) {

if(recv(s,datos_recibir,sizeof(char)*20, 0) == -1)

{

perror("recv");

return 1;

}
datos_enviar=juego(datos_recibir);
if(strcmp(datos_enviar,"FIN"))
break;

if(send(s,datos_enviar,sizeof(char)*50,0)==-1)

{

perror("send");

return 1;

}

}

close(s);

}


void serv_udp(int s)
{
printf("bien");
}

/*
void serv_udp(int s)
{
//weno noe sta bien exa del todo, solo copiao
struct linger linger;
struct sockaddr_in auxudp;
struct sockaddr_in udp2;

recivfrom(s,&datos, sizeod(datos),0,(struct sockaddr*)&cliente,&addrlen);
auxudp=socket(AF_INET,SOCK_DEGRAM);

linger.l_onoff=1;
linger.l_linger=1;
setsockopt(auxudp, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));

udp2.sin_family=AF_INET;
udp2.sin_addr.s.addr=INADDR_ANY;
udp2.sin_port=0;

bind(auxudp,(const struct sockaddr*)&udp2, sizeof(struct sockaddr_in));
sendto(auxudp,&datos, sizeof(datos),0,(struct sockaddr*)&cliente, sizeof(cliente));
close(udp2);
close(s); //esto nose,....
}

*/


char* juego(char *datos_recibir)
{
char *datos_enviar=NULL;
int numero_pensado;
int numero_recibido;
int intentos=0;

srand(time(0));
numero_pensado=rand()%100;

if(strcmp(datos_recibir,"FIN"))
return(strcpy(datos_enviar,"FIN"));

else {
numero_recibido=atoi(&datos_recibir);


if(numero_recibido==numero_pensado) {
strcpy(datos_enviar,"IGUAL,Sigue el juego, acierta un numero:::");
intentos=0;
return datos_enviar;
}

if(numero_recibido>numero_pensado)
{
strcpy(datos_enviar,"Mayor");
datos_enviar[5]=intentos;
intentos++;
return datos_enviar;
}

if(numero_recibido<numero_pensado)
{
strcpy(datos_enviar,"Menor");
datos_enviar[5]=intentos;
intentos++;
return datos_enviar;
}

if(intentos==4)
{
datos_enviar=NULL;
strcpy(datos_enviar,"superaste el maximo de intentos y no acertaste. volvemos a empezar,tienes otros 5 intentos.");
intentos=0;
return datos_enviar;
}

}
}

int crearSocket (TPDU tpdu, int rol)
{
int lstcp;

lstcp = socket (AF_INET, SOCK_STREAM, 0); //creo un socket, IP v4 y TCP


if (lstcp == -1) {
exit(1);
}


if (bind(lstcp, (const struct sockaddr *) &servidor_tcp, sizeof(struct sockaddr_in)) == -1) {

exit(1);
}


if (listen(lstcp, 5) == -1) {

exit(1);
}
}
haber si alguien me puede exar una ayudita
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problemas de core dumped

Publicado por fernando.gomez (1604 intervenciones) el 27/12/2007 20:54:16
Por "core dumped", ¿te refieres a una fuga de memoria (memory leak)?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por Tom (481 intervenciones) el 28/12/2007 10:09:27
El "core dumped" está causado, la mayor parte de las veces, por tratamiento incorrecto de la memoria, o sea, problemas de punteros.

El S.O. cancela el proceso que trata de acceder a memoria que no le corresponde, y deja en el disco un volcado de la memoria usada. Este volcado o "core" se puede examinar, por ejemplo, con gdb para tratar de averigüar el fallo.

Aprovecho para recordar al preguntante que "haber" es un verbo que no pinta nada donde él lo ha puesto y que, igual que en un lengüaje de programación, no se deben poner cosas "a boleo" y en cualquier sitio si se quiere que algo funcione.

Y es una pena que se perdiera tu carta a los Reyes :-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por fernando.gomez (1604 intervenciones) el 29/12/2007 23:11:38
He vivido toda mi vida intentando hacer que la gente entienda las diferencias entre "haber" y "a ver". Y todo este tiempo solo he tenido frustraciones --algo así como cuando la gente no pone el "int" como tipo de retorno de "main"--. Ambos, casos perdidos, jejeje :P.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por Tom (481 intervenciones) el 28/12/2007 10:21:20
Primero que todo, insisto en el desagradable tema de poner el verbo haber en cualquier sitio. Hay que leer un poco.
Para programar en C, también hay que leer un poco.

Tu código es bastante débil, hay muchas posibles condiciones de error que no controlas.

Ahora mismo peta porque haces un strcpy() sobre un string que no tiene memoria asignada, encuéntralo y arréglalo (es bastante fácil) y habrás aprendido algo que te servirá.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por jose (2 intervenciones) el 28/12/2007 13:48:58
gracias, intentare eso,
el problema por el cual, pongo haber sin hache no es por falta de lectura, sino por vagancia,
Y de lectura voy bastante servido, jejjee
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por Tom (481 intervenciones) el 28/12/2007 14:03:25
La ignorancia es atrevida.

Esa respuesta es digna de entrar en el "top" de las inocentadas del 28 de Diciembre X-D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas de core dumped

Publicado por fernando.gomez (1604 intervenciones) el 29/12/2007 23:13:13
Jajajaja, Tom, hiciste mi día con esto; pero sí, tienes razón.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

OT - RE:problemas de core dumped

Publicado por fernando.gomez (1604 intervenciones) el 30/12/2007 00:04:46
Jejeje, el problema --creo-- es que pusiste en tu frase:

"haber si alguien me puede ayudar"

"Haber" es un verbo, en infinitivo, y se emplea de dos formas: como auxiliar y como verbo tal cuál. El primero se emplea, por ejemplo, cuando conjugas un tiempo compuesto (digamos, pasado [im]perfecto):

yo he comido
tú has/habéis comido
él/ella/eso ha comido
nosotros hemos comido
vosotros/ustedes han/habéis comido
ellos han comido

En este caso, el verbo tiene una inflexión (o morfema gramatical, si quieres ser riguroso) por lo que se transforma "haber" en alguna de sus conjugaciones (he, has, ha, hemos, han, habéis).

El segundo caso es cuando se emplea como verbo no auxiliar, y puede tener varios significados. Por ejemplo, cuando lo usas con otro infinitivo sería sinónimo de "deber, tener que" (i.e. "habré de comprar comida"). También lo puedes emplear en una forma impersonal, en cuyo caso significaría "ocurrir", como en "hubo un problema". Y así hay varios significados.

En tu frase, la presentas en infinitivo, así que descartamos la opción de auxiliar. Y en la segunda opción, pues ninguno de los diferentes significados aplica, ¿verdad?

Entonces tenemos un error de semántica. Lo que quieres dar a entender es que quieres ver si existe alguna persona que te pueda ayudar. Es deicr, "a ver" si alguien te puede ayudar. De ahí lo que Tom te decía.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar