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
#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


0