Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - soyloqbuskas

#31
¡Buenas kiximbo!

La pregunta importante es....¿Por que hacerlo en scilab y no en C?
Te lo digo porque es muy posible que encuentres muchos mas tutoriales de C que de scilab...de hecho, por el foro encontraras muchas funciones en C que necesitas para tu juego como por ejemplo la creacion del tablero que es una matriz de tipo ficha....
ficha_t tablero[10][10];
Y la funcion random() ya esta implementada en C...asi que te recomiendo que lo hagas en C mejor que en scilab ya que podras tener mucha mas ayuda.

Un saludo.
#32
Programación C/C++ / time() localtime()
3 Noviembre 2012, 06:03 AM
Buenas a todos!

tengo un problema con esta funcion...me da fallo de segmentacion en la funcion localtime()
char * getDateTime(){
        char * fecha=(char*)malloc(200);
        time_t t = time(NULL);
        struct tm *tm = localtime(&t);
        char * dia="";
        char * mes="";
       
        switch(tm->tm_wday){

                case 0: dia="Sun"; break;
                case 1: dia="Mon"; break;
                case 2: dia="Tue"; break;
                case 3: dia="Wed"; break;
                case 4: dia="Thu"; break;
                case 5: dia="Fri"; break;
                case 6: dia="Sat"; break;
                default: dia="???"; break;
        }

        switch(tm->tm_mon){

                case 0: mes="Jan"; break;
                case 1: mes="Feb"; break;
                case 2: mes="Mar"; break;
                case 3: mes="Apr"; break;
                case 4: mes="May"; break;
                case 5: mes="Jun"; break;
                case 6: mes="Jul"; break;
                case 7: mes="Aug"; break;
                case 8: mes="Sep"; break;
                case 9: mes="Oct"; break;
                case 10: mes="Nov"; break;
                case 11: mes="Dec"; break;
                default: mes="???"; break;
        }

        sprintf(fecha,"Date: %s , %d %s %d %d:%d:%d GMT",dia, tm->tm_mday, mes, tm->tm_year+1900, tm->tm_hour, tm->tm_min, tm->tm_sec);
        return fecha;
}


¿Por que me da fallo de segmentacion?

Gracias, un saludo
#33
Programación C/C++ / Re: Send() return -1 en C
2 Noviembre 2012, 04:02 AM
Pues...creo que si....el socket lo asocio con un bind() a la interfaz de red wlan0 y el paquete que le mando tiene un struct ethdr + struct iphdr + struct tcphdr , deberia mandar algon antes del struct ethdr??
#34
Programación C/C++ / Re: Send() return -1 en C
2 Noviembre 2012, 01:40 AM
Una pregunta....¿Es posible que el error sea por que creo 2 sockets? es decir, ¿una aplicacion de C en linux solo puede abrir un solo sockect?

Es que ya no se me ocurren mas ideas....
#35
Programación C/C++ / Send() return -1 en C
1 Noviembre 2012, 02:56 AM
¡Buenas a todos!

Tengo un problema con la funcion send(). Siempre me retorna -1 y no se porque....

El socket lo creo asi:
int CreateRawSocket(int protocol_to_sniff){
//Crea un raw socket
       int rawsock;
       if((rawsock = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)))== -1)
       {
               perror("Error creating raw socket: ");
               exit(-1);
       }


       return rawsock;
}


El bind lo hago asi:
int BindRawSocketToInterface(char *device, int rawsock, int protocol){
//Hace un bind del socket con la interfaz de red

       struct sockaddr_ll sll;
       struct ifreq ifr;

       bzero(&sll, sizeof(sll));
       bzero(&ifr, sizeof(ifr));

       strncpy((char *)ifr.ifr_name, device, IFNAMSIZ);
       if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
       {
               printf("Error getting Interface index !\n");
               exit(-1);
       }

       sll.sll_family = AF_PACKET;
       sll.sll_ifindex = ifr.ifr_ifindex;
       sll.sll_protocol = htons(protocol);


       if((bind(rawsock, (struct sockaddr *)&sll, sizeof(sll)))== -1)
       {
               perror("Error binding raw socket to interface\n");
               exit(-1);
       }

       return 1;

}


Luego creo un char * con los datos a enviar y lo envio con esta funcion:
int SendRawPacket(int rawsock, char *pkt, int pkt_len){
//Envia un raw packet
       int sent=0;
   
       if((sent = send(rawsock, pkt, pkt_len,TH_FLAGS)) != pkt_len)
       {
               /* Error */
               printf("Could only send %d bytes of packet of length %d\n", sent, pkt_len);
               return 0;
       }

       return 1;
}


Y la funcion send() siempre me retorna -1 y no se porque...El socket esta bien creado...lo he mirado con gdb y tengo la variable rawsock=8. Y la variable pkt_len=strlen(pkt)=54

Si el socket esta bien creado y el bind es correcto...¿Por que no me envia los datos?

Gracias, un saludo.
#36
Hacking / Re: wireshark "bytes in flight"
31 Octubre 2012, 02:00 AM
Nada, al final esto fue un fallo tonto que tuve....

Wireshark no me detectaba mis paquetes HTTP porque la cabecera HTTP no era correcta. El campo "Content-Length" lo habia escrito sin una "t"....."Content Lengh"....en cuanto lo corregi, wireshark me lo detecto como un paquete HTTP.

Gracias, un saludo.
#37
¡Gracias por sus respuestas!

Al final el codigo me ha quedado asi...

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

void * pararBucle();

char * c="a";

int main(){

        pthread_t hilo;
        pthread_create(&hilo,NULL, pararBucle,NULL);

        printf("Iniciando bucle infinito\n");
        while(strcmp(c,"q")){

        }

        return 0;
}

void * pararBucle(){

        char  aux='a';
        while(aux!='q')
                read(STDIN_FILENO,&aux,1);
        printf("Presionaste q\n");
        c="q";
        return (void *)"q";
}


Lo unico que tiene una variable global que no se como quitar.
He probado a pasarle la variable c a la funcion pthread_create() asi:
pthread_create(&hilo,NULL, pararBucle,(void *) c);

Y luego le paso un void * a  la funcion pararBucle(void * c){}
Con estos cambios el programa compila, pero la funcion pararBucle cuando acaba no cambia el valor de c y el bucle infinito no para.

Asi que....¿que debo hacer para que la variable c quede compartida por ambos hilos?

Gracias, un saludo.
#38
Pufff ando atascado....la verdad es que no sa casi nada de hilos....

He probado esto....
#include <stdio.h>
#include <pthread.h>
#include <string.h>

void * pararBucle();

char * c="a";

int main(){

        pthread_t hilo;
        pthread_create(&hilo,NULL, pararBucle,NULL);

        printf("Iniciando bucle infinito\n");
        while(strcmp(c,"q")){

        }

        return 0;
}

void * pararBucle(){

        char * aux="a";
        while(strcmp(aux,"q"))
                fgets(aux,1,stdin);

        printf("Presionaste q\n");
        c="q";
        return (void *)"q";
}


Pero me da fallo de segmentacion....

¿Alguna sugerencia?
#39
¡Buenas a todos!

Estoy haciendo un programa que tiene un bucle el cual quiero parar cuando el usuario presione la tecla 'q'. El problema esta en que con funciones como getch() y demas, el bucle para su ejecucion y espera a que el usuario presione una tecla y esto es lo que no quiero. La idea es que el bucle funcione en todo momento y que cuando el usuario presione 'q' se finalice el bucle.

He probado varias ideas que no me han salido bien....como por ejemplo usar hilos de tal forma que un hilo tiene el bucle y el otro hilo el getch()....tambien he probado ha hacer lo mismo pero con procesos y tampoco me ha salido bien....

Asi que como estoy un poco atascado, cansado y deseperado....creo que lo que me queda es hacer polling al teclado....el problema es que sé que esta tecnica va a funcionar seguro pero no se implementarlo....Imagino que sera con alguna funcion que lea el stdin o algo asi...

¿Alguien sabe como hacer polling al teclado para leer la pulsacion de una tecla?

NOTA: estoy programando en C para linux

Gracias, un saludo.
#40
Programación C/C++ / Re: Sobre los Cast
26 Octubre 2012, 06:20 AM
¡Buenas BlackZeroX (Astaroth)!

Bueno, por lo que veo los errores de compilacion que tienes son por pasar una variable a una funcion del tipo incorrecto. Evidentemente eso se soluciona con un cast. Los cast son necesarios en casi cualquier programa ya que a menudo se necesita cambiar el tipo de una variable para operar con ella. Asi que no hay problema por usar un cast. Lo unico ha tener en cuenta es que si necesitas que tu programa sea muy rapido, los cast llevan tiempo y no deberias hacer cast muy amenudo, esto restaria eficiencia a tu programa.

Un ejemplo tipico del uso del cast es cuando lees un numero del teclado y lo guardas en un char* para evitar que el programa explote si el usuario mete un caracter. Este mecanismo de proteccion te obliga a hacer un atoi(var); (que es un cast de char* a int) para poder operar aritmeticamente con la variable leida. Asi que yo no veo ningun problema con los cast salvo el uso abusivo que reduce la eficiencia del programa.

En cuanto a los typedef...efectivamente solo sirven para abreviar y que el codigo sea mas legible, no le veo mas utilidad.

Sobre compilar con -std=c99....esto hace que no compiles con /usr/bin/gcc lo que hace es que compilas con /usr/bin/c99 que es otro compilador de C, pero no se que ventajas o inconvenientes tiene sobre gcc.

Y con gcc -w, creo que esta opcion desabilita los warnings....porque he probado a compilar un programa con un warning y con gcc -Wall si veo el warning y con gcc -w no. Asi que gcc -w no te losuciona los problemas solo te los aculta.

Espero haberte ayudado, un saludo.