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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: 1 ... 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [30] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ... 125
291  Programación / Programación C/C++ / Re: ayuda con strings en: 24 Julio 2014, 17:09 pm
Nota incial: Para el código, usa las etiquetas GeSHi, gracias.

Código
  1. void split(char *s[], char *c1[], char *c2[], char *car){
  2.   if (strstr(s[60], car)){
  3.      char aux=s-strlen(strstr(s[60], car));
  4.      strcat(c1[60], aux);
  5.      strcat(c2[60], (strchr(s[60], (strlen(car)+1))));
  6.   }
  7. }

'strstr' devuelve el puntero a la primera aparición de 'car'... si reutilizases ese valor tendrías medio trabajo hecho...

Una cosa que no entiendo es por qué tienes 's[60]' en el strstr, en el strlen, en... eso está mal.

Código
  1. void split(char *s[], char *c1[], char *c2[], char *car){
  2.   if (strstr(s, car)){
  3.      char aux=s-strlen(strstr(s, car));
  4.      strcat(c1, aux);
  5.      strcat(c2, (strchr(s, (strlen(car)+1))));
  6.   }
  7. }

De primeras no se si así funcionará... no puedo compilar ahora, pero al menos pasas punteros a las funciones en vez de valores que no tienen ningún sentido.
292  Programación / Programación C/C++ / Re: [Ayuda] Programa en C en: 24 Julio 2014, 16:35 pm
Nota inicial: Para el código, usa las etiquetas GeSHi, gracias.

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <math.h>

Si estás cargando las librerías cstdlib e iostream, estás programando en C++, no en C. Los includes de la librería estándar de C tienen TODOS el ".h"... en el caso de la librería de C++, NO hay includes con ".h". Te lo comento para que luego no te lleves sustos.

Código
  1. using namespace std;

Los espacios de nombre son también un elemento propio de C++... deberías quitarlo y, si te aparecen errores por ello, es porque estás haciendo uso de utilidades propias de C++.

Código
  1. int carga (int x);
  2. int carga (int x) /* Funcion que permite cargar toda la matriz*/
  3. {
  4. }

Las declaraciones de funciones ( en tu caso la primera línea del código que te he puesto ) sólo son necesarias cuando aparecen llamadas a la función antes que su implementación. Un ejemplo:

Código
  1.  
  2. void func3( void );
  3.  
  4. void func1( void )
  5. {  puts( "Hola\n" ); }
  6.  
  7. int main( void )
  8. {
  9.  func1( ); // Ok, su uso es posterior a su implementacion
  10.  func2( ); // Error, esta funcion no esta definida todavia
  11.  func3( ); // Ok, no esta implementada pero si definida
  12. }
  13.  
  14. void func2( void )
  15. { puts( "---\n" ); }
  16.  
  17. void func3( void )
  18. { puts( "Adios\n" ); }

Más cosas...

Código
  1. int carga (int x) /* Funcion que permite cargar toda la matriz*/
  2. {
  3.  int register k,l;
  4.  for (k=0;k<N;k++)
  5.  {
  6.    for (l=0;l<M;l++)
  7.    {
  8.      printf ("Ingrese un numero ");
  9.      scanf ("%f",x);
  10.    }
  11.  }
  12. }

La llamada a "scanf" esta mal por tres razones:

1. %f se usa para números con decimales (float, double)... x es de tipo entero (int)
2. scanf necesita un puntero a la variable donde debe almacenar los valores que introduzca el usuario... 'x' se está pasando por valor
3. 'carga' está recibiendo 'x' por valor, es decir, todos los cambios que se hagan en 'x' se van a perder una vez el código sale de la función 'carga'.

Ah si... segun la firma actual, 'carga' debería tener un return y devolver un entero... si una función no ha de devolver nada debe ir precedida de 'void'.

La función debería estar más bien así:

Código
  1. void carga (int* x) /* Funcion que permite cargar toda la matriz*/
  2. {
  3.  int register k,l;
  4.  for (k=0;k<N;k++)
  5.  {
  6.    for (l=0;l<M;l++)
  7.    {
  8.      printf ("Ingrese un numero ");
  9.      scanf ("%d",x);
  10.    }
  11.  }
  12. }

Ahora, 'x' es un puntero, por lo que, por un lado, scanf podrá almacenar el valor en la variable apuntada por 'x' sin problemas y, por otro, los cambios en 'x' se reflejarán fuera de la función.

Debido al cambio de la firma de "carga", también hay que cambiar ahora sus llamadas. "carga" ahora necesita un puntero:

Código
  1. int main(int argc, char *argv[])
  2. {
  3.    int num;
  4.    carga (&num);
  5. }

Más cosas...

Código
  1. int arr[N][M];
  2. int cascara;
  3. int i, j;
  4. for (i=0; i<N; i+1)
  5. {
  6.  for (j=0; j<M; j+1)
  7.  {
  8.    cascara = (cascara + arr[j]);
  9.  }
  10. }

'arr' es un arreglo bidimensional, luego para acceder a sus valores necesitas pasarle dos índices... tu estás pasando sólamente uno. Esto tendría que quedar más o menos así:

Código
  1. int arr[N][M];
  2. int cascara;
  3. int i, j;
  4. for (i=0; i<N; i+1)
  5. {
  6.  for (j=0; j<M; j+1)
  7.  {
  8.    cascara = (cascara + arr[i][j]);
  9.  }
  10. }

Además, 'arr' está definda tal que 'arr[N][M]'... no tiene sentido que le pases como primer índice 'j', que está definida en el rango '0..M'; necesitas un índice definido en el rango '0..N' y ese índice es 'i'... no 'j'.

Por otro lado, no has asignado valores a los elementos contenidos en 'arr', así como tampoco has asignado valores a 'cascara' (ni a otras tantas variables)... los resultados finales de las operaciones que tienes puestas ahí van a ser totalmente incoherentes, ya que estás leyendo basura:

Código
  1. int main( )
  2. {
  3.  int numero;
  4.  printf( "%d\n", numero );
  5. }

¿Qué imprime el código anterior? ¿tu lo sabes? yo lo único que se es que la salida del programa puede cambiar en diferentes ejecuciones. Sin embargo:

Código
  1. int main( )
  2. {
  3.  int numero = 10;
  4.  printf( "%d\n", numero );
  5. }

Estoy totalmente seguro que la salida de esta segunda versión será siempre '10'.

Más cosas... podría seguir pero creo que ya es bastante ayuda.

Moraleja: Estudia unos cuantos tutoriales o manuales de C antes de meterte en estos jardines... aprenderá más, será más satisfactorio para tí y aprenderás más ( lo pongo dos veces para darle énfasis... es importante).
293  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 24 Julio 2014, 08:59 am
Es una chorrada, pero es bueno ir adquiriendo buenas prácticas... sobretodo porque como te de en el futuro por cambiar algo te va a volver a dar problemas. Esto:

Código
  1.        len=strlen("nombre=nombre123correcto&contenido=123456");
  2.        itoa(len,cad,10);
  3.        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
  4.        strcat(buffer,"Host: mipaginaweb.free33.com\r\n");
  5.        strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n");
  6.        strcat(buffer,"Content-length: ");
  7.        strcat(buffer,cad);
  8.        strcat(buffer,"\r\n");
  9.        strcat(buffer,"nombre=nombre123correcto&contenido=123456");
  10.        printf("%s\n",buffer);

Se debería parecer más a esto:

Código
  1.        char* contenido = "nombre=nombre123correcto&contenido=123456";
  2.        len = strlen( contenido );
  3.        itoa(len,cad,10);
  4.        strcpy(buffer,"POST /index.php HTTP/1.0\r\n");
  5.        strcat(buffer,"Host: mipaginaweb.free33.com\r\n");
  6.        strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n");
  7.        strcat(buffer,"Content-length: ");
  8.        strcat(buffer,cad);
  9.        strcat(buffer,"\r\n");
  10.        strcat(buffer, contenido);
  11.        printf("%s\n",buffer);

El motivo es obvio... tener un mensaje duplicado implica tener que actualizarlo en dos o más sitios so pena que el paquete pase a estar mal construido y te falle la comunicación.

Ojala supiera emular un servidor, jaja entonces no estaba aquí supongo xD, ok gracias eferion es cierto ahí sería content, yo creo que es un fallo de cabecera, donde pongo host, pongo el host con el que accedo a la pagina desde navegador, no con el que accedo por ftp con filezilla, no se cual de los 2 poner.

Espero no haber metido la pata con el código, lo he hecho "a mano alzada" y no está probado.

Código
  1. #define MAX_BUFFER 512
  2.  
  3. // OJO que los puertos inferiores a 1024 estan reservados, lo mismo tienes que cambiar el puerto
  4. #define PUERTO_SERVIDOR "80"
  5.  
  6. int main( void )
  7. {
  8.    WSADATA wsaData;
  9.  
  10.    // Inicializamos WinSock
  11.    int errorCode = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
  12.    if ( errorCode != 0 )
  13.   {
  14.        printf("Error en WSAStartup: %d\n", errorCode );
  15.        getch( );
  16.        return 1;
  17.    }
  18.  
  19.    struct addrinfo configInicial;
  20.    ZeroMemory( &configInicial, sizeof( configInicial) ); // IMPORTANTE limpiar la memoria
  21.    configInicial.ai_family   = AF_INET;
  22.    configInicial.ai_socktype = SOCK_STREAM;
  23.    configInicial.ai_protocol = IPPROTO_TCP;
  24.    configInicial.ai_flags    = AI_PASSIVE;
  25.  
  26.    // Resolver la dirección IP y el puerto del servidor
  27.    struct addrinfo *configServidor= NULL;
  28.    errorCode = getaddrinfo( NULL, PUERTO_SERVIDOR, &configInicial, &configServidor );
  29.    if ( errorCode != 0 )
  30.    {
  31.        printf("Error en getaddrinfo: %d\n", errorcode );
  32.        WSACleanup( ); // IMPORTANTE reiniciar WinSock
  33.        return 1;
  34.    }
  35.  
  36.    // Crear socket de escucha
  37.    SOCKET socketServidor= INVALID_SOCKET;
  38.    socketServidor= socket( configServidor->ai_family, configServidor->ai_socktype, configServidor->ai_protocol );
  39.    if ( socketServidor== INVALID_SOCKET )
  40.    {
  41.        // Fijate que podemos obtener el codigo de error al crear el socket
  42.        printf("Error al crear socket de escucha: %ld\n", WSAGetLastError( ) );
  43.  
  44.        // Hay que limpiar la memoria
  45.        freeaddrinfo( configServidor );
  46.  
  47.        // Y reiniciar WinSock
  48.        WSACleanup();
  49.        return 1;
  50.    }
  51.  
  52.    // Se enlaza el socket del servidor para que use la ip y el puerto solicitado
  53.    errorcode = bind( socketServidor, configServidor->ai_addr, (int)configServidor->ai_addrlen );
  54.    if ( errorCode == SOCKET_ERROR)
  55.    {
  56.        printf("Error en bind: %d\n", WSAGetLastError( ) );
  57.  
  58.        // Liberamos recursos
  59.        freeaddrinfo( configServidor );
  60.        closesocket( socketServidor );
  61.        WSACleanup( );
  62.        return 1;
  63.    }
  64.  
  65.    // Ya no necesitamos esta configuracion, el socket esta creado
  66.    freeaddrinfo( configServidor );
  67.  
  68.    // Dejamos al socket esperando conexiones
  69.    errorCode = listen( socketServidor , SOMAXCONN );
  70.    if (errorCode == SOCKET_ERROR)
  71.    {
  72.        printf( "Error listen: %d\n", WSAGetLastError( ) );
  73.        closesocket( socketServidor);
  74.        WSACleanup( );
  75.        return 1;
  76.    }
  77.  
  78.    // Procesamos las peticiones que nos llegan
  79.    do
  80.    {
  81.        SOCKET socketCliente= INVALID_SOCKET;
  82.        socketCliente= accept( socketServidor, NULL, NULL );
  83.        if ( socketCliente== INVALID_SOCKET)
  84.        {
  85.            printf( "Error en conexion entrante: %d\n", WSAGetLastError( ) );
  86.            closesocket( socketServidor );
  87.            WSACleanup( );
  88.            return 1;
  89.        }
  90.  
  91.        // Recibimos el mensaje del cliente
  92.        printf( "Conexión entrante:\n" );
  93.        printf( "------------------------------------------\n" );
  94.        int bytesMensaje = 0;
  95.        char recvbuf[ MAX_BUFFER ];
  96.        int recvbuflen = MAX_BUFFER;
  97.        do
  98.        {
  99.            bytesMensaje = recv( socketCliente, recvbuf, recvbuflen, 0 );
  100.            if ( bytesMensaje > 0)
  101.            {
  102.                recvbuf[ bytesMensaje ] = 0;
  103.                printf( "Mensaje recibido:\n" );
  104.                puts( recvbuf );
  105.                printf( "\n" );
  106.                printf("Bytes recibidos: %d\n", bytesMensaje );
  107.  
  108.                // Tambien podemos enviarle una respuesta al cliente
  109.                // En este caso le devolvemos el mensaje que nos ha enviado
  110.                bytesMensaje = send( ClientSocket, recvbuf, bytesMensaje, 0 );
  111.                if ( bytesMensaje == SOCKET_ERROR)
  112.                {
  113.                    printf("Error al enviar la respuesta: %d\n", WSAGetLastError()  );
  114.                    closesocket( socketCliente );
  115.                    break;
  116.                }
  117.                printf( "Bytes enviados: %d\n", bytesMensaje );
  118.            }
  119.            else if ( bytesMensaje == 0 )
  120.                printf( "Conexion con el cliente cerrada.\n" );
  121.            else
  122.                printf( "Error al establecer conexion con cliente: %d\n", WSAGetLastError( ) );
  123.        } while ( bytesMensaje > 0 );
  124.  
  125.        closesocket( socketCliente );
  126.    } while ( 1 );
  127.  
  128.    // En este caso el servidor no para nunca
  129.    // Si se programase una parada habria que realizar las tareas de limpieza
  130.    closesocket( socketServidor );
  131.    WSACleanup( );
  132.  
  133.    return 0;
  134. }

294  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 23 Julio 2014, 17:03 pm
jajaja ya lo siento eferion pensaba que me estabas vacilando no quería ser cruel, pero tus preguntas me parecian absurdas y que estaban en el código todas, sino fallo mio por pasarme de listo xD.

En ese caso sin problemas. Intento que mis preguntas tengan cierto sentido, aunque a veces no lo parezcan. Me puede pasar, como a todo hijo de vecino, que pregunte algo que ya esté contestado en el código... pese a quien le pese soy humano y a veces también me equivoco, aunque no lo hago de mala fe.

La IP es así 84.234.145.130 solo que con numeros cambiados, la obtuve haciendo ping al servidor web, y el socket se crea correctamente,no creo que haya ningún fallo al respecto

Ok, por tu comentario anterior pensé que estabas leyendo la IP dinámicamente haciendo un ping al servidor o algo así... y no me cuadraba el asunto para nada. Cuando consigas corregir esto sería una buena mejora que permitas especificar la dirección del servidor en un archivo de configuración (bien por DNS - lo ideal -, bien por ip). Tener estos datos escritos a pelo en el código solo dan problemas.

printf("%d\n",direccion.sin_family);//muestra 2
printf("%d\n",direccion.sin_port);//muestra 20480
printf("%d\n",direccion.sin_addr.s_addr);//muestra -21023899

Pero no entiendo la IP es la que devuelve el ping no? xD

la función inet_addr hace una conversión para "empaquetar" la ip en formato de red. Esta función tiene en cuenta, entre otras cosas, si tu máquina es BIG ENDIAN o LITTLE ENDIAN a la hora de realizar la conversión... además la IP es de tipo "unsigned", luego si la imprimes con "%d" que se usa para "signed", el valor que te saque no va a servirte de mucho.

PD.: prueba a cambiar Context-Type por Content-Type. Hasta donde llego, Context-Type no es un parámetro válido de cabecera. Lo mismo al tener una cabecera incorrecta el servidor rechaza la conexión... o no sabe como tratarla.

Si esto no soluciona el problema yo realizaría otra prueba para eliminar puntos de fallo:

* Crea un programa que "emule" al servidor web, de tal forma que, simplemente, te saque por pantalla todo lo que reciba por el socket. Después lanza tu cliente contra este programa y mira a ver si imprimes algo. Así al menos puedes verificar que el programa realiza una salida y además puedes comprobar si ésta es la esperada.
295  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 23 Julio 2014, 15:14 pm
Edito: ¿No ves que si? OMG antes de preguntar dedica un minisegundo a mirar el código

Código
  1. direccion.sin_addr.s_addr=inet_addr(ip);

Si, pedazo de comprobación... seguro que esta línea funciona aunque en "ip" esté poniendo "estoesunamierda" en vez de algo tipo "192.168.1.5"... si, no se cómo no he podido ver que, efectivamente, estabas haciendo todas las comprobaciones precisas para asegurar que "ip" tiene una dirección IP válida.

Gracias por tu ayuda eferion, ahora deja a los demás responder, el código ya está posteado no voy a responder preguntas absurdas.

Me parece estupendo... seguro que con tus super conocimientos de C y C++ eres capaz de sacarlo tu solo... a no, espera, que estás aquí pidiendo ayuda.

¿Crees que le estoy quitando a alguien el derecho a responderte? ¿De verdad sabes cómo funciona Internet?

Si alguien te quiere responder lo podrá hacer te pregunte o no absurdeces que, dicho sean de paso, pueden dar lugar a que tu super programa de 30 líneas no funcione.

Ahora permite que un ignorante como yo que, de seguro, ha hecho más programas que tú (y que además funcionan) te explique un pequeño detalle:

Citar
Si tu programa tuviese un error de bulto habría aflorado en los primeros 3 o 4 mensajes, la gente que suele contestar en este foro no es manca... Dado que no ha sido así tu problema puede estar en los detalles más absurdos:

* Falta de permisos de escritura
* Estás recuperando mal la IP
* No has inicializado correctamente el socket (ya se ha visto que no es esto)

Detalles así de divertidos y de obvios que hacen que la gente pierda su tiempo en contestar a una persona como tú que recurre aquí porque no tiene ni la más remota idea de cómo solucionar un problema... y encima se queja cuando la intentan ayudar... no se, tu mismo.

Y dicho esto, te tomo la palabra. Tranquilo que no vuelvo a pasarme por este hilo... ni por este ni por ninguno que abras... puede que con esto pierdas algún que otro consejo valioso o puede que no. Yo por mi parte me guardo mi opinión personal al respecto.



EDITO:

Solo una pregunta tonta que vuelvo a repetir porque, insisto, no lo veo en el código

¿Dónde narices está el código que asigna un valor a "ip"?

O mejor, no contestes, seguro que así es más divertido encontrar el fallo a tu programa.
296  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 23 Julio 2014, 13:18 pm
y asumo que has comprobado que el valor almacenado en esa variable es el correcto, cierto?
297  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 23 Julio 2014, 10:40 am
Cómo estás generando "ip"?
298  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 23 Julio 2014, 08:34 am
Una pregunta tonta... en qué punto concreto has inicializado el socket. Algo del tipo:

Código
  1. if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){ }

Si no has inicializado el socket es como intentar escribir en un fichero que no has abierto.

Esta línea o su equivalente debería ir antes del "connect".


Cierto, error mio, no lo ví y eso que estuve mirando el código con "tranquilidad".

Un saludo.
299  Programación / Programación C/C++ / Re: Problema en codigo C++ en: 23 Julio 2014, 08:25 am
El número que recibes se encuentra en binario y tu has de convertirlo a su representación en base 10.

Para convertir un número de una base a otra tienes que ir procesando el número cifra a cifra. Por tanto, almacenar el número en binario no parece una buena idea (además un número en binario ocupa más que el equivalente en decimal: 100 = 8, por lo que almacenar el binario, en un entero como si fuese un decimal te va a limitar el rango de datos).

Lo suyo es que almacenes el número en una cadena de texto (clase string)... entonces recorres dicha cadena de principio a fin y para cada carácter de la cadena haces lo siguiente:

* Multiplicas el resultado parcial por 2
* Sumas la equivalencia decimal del caracter actual: ( '0' = 0, '1' = 1 )

Al finalizar el proceso tendrás la equivalencia decimal del número binario que has introducido.

PD.: El siguiente código

Código
  1. while ((numero / numeroDivisor) == 0)

Solo va a ser verdadero cuando numero < numeroDivisor, es decir, que salvo que metas un "binario" menor que 10 -> 2 en base decimal, el resultado del while va a ser falso... ese es el motivo por el que no te imprime nada.
300  Programación / Programación C/C++ / Re: Ayuda envío archivo a web con C vía http en: 22 Julio 2014, 21:15 pm
Estás seguro de que tienes permisos de escritura para la ruta del archivo?
Páginas: 1 ... 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [30] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines