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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error de violación de acceso en mi programa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Error de violación de acceso en mi programa  (Leído 11,406 veces)
Chains

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Error de violación de acceso en mi programa
« Respuesta #10 en: 6 Febrero 2012, 22:57 pm »

Si, estoy realizando un programa de consola en Windows. Uso el entorno de desarrollo Code::Blocks, y de compilador el GNU GCC Compiler, que viene por defecto con éste entorno de desarrollo. El código, por cierto, lo saqué de ésta página: http://www.nullterminator.net/winsock.html, y sólo le realicé algunas modificaciones al código del servidor, porque me daba algunos errores y también para ajustarlo a mis necesidades.

He probado a inicializar winsock en el programa cliente usando el siguiente código:

Código
  1. WSADATA wsaData;
  2.    WORD version;
  3.    int error;
  4.  
  5.    version = MAKEWORD( 2, 0 );
  6.  
  7.    error = WSAStartup( version, &wsaData );
  8.  
  9.    /* check for error */
  10.    if ( error != 0 )
  11.    {
  12.    /* error occured */
  13.        return FALSE;
  14.    }
  15.  
  16.    /* check for correct version */
  17.    if ( LOBYTE( wsaData.wVersion ) != 2 ||
  18.        HIBYTE( wsaData.wVersion ) != 0 )
  19.    {
  20.    /* incorrect WinSock version */
  21.        printf("\n\nError 01: Incorrect WinSock Version. LOBYTE: %n . HIBYTE: %n .", (INT*)LOBYTE( wsaData.wVersion ), (INT*)HIBYTE( wsaData.wVersion ));
  22.        WSACleanup();
  23.        return FALSE;
  24.    }
  25.  
  26.    client = socket( AF_INET, SOCK_STREAM, 0 );
  27.  
  28. /* Resto del progrma */

También he añadido las correspondientes líneas al final del código para cerrar el socket, pero sigo recibiendo el mísmo error al llegar a la mísma línea.



A continuación dejo el código entero del cliente con las modificaciones realizadas:

Código
  1. /* CLIENT */
  2. #define __rtems__
  3. #include <windows.h>
  4. #include <winsock2.h>
  5. #include <stdio.h>
  6. //#include <pthread.h> //Es para crear POSIX threads, lo necesitaré más tarde
  7. #include <conio.h>
  8. #include <iostream>
  9. #include <conio.h>
  10. #include <fstream>
  11.  
  12. SOCKET client;
  13. struct hostent * host;
  14. char* hostname;
  15.  
  16. int main()
  17. {
  18.    hostname = new char[1024];
  19.    WSADATA wsaData;
  20.    WORD version;
  21.    int error;
  22.  
  23.    version = MAKEWORD( 2, 0 );
  24.  
  25.    error = WSAStartup( version, &wsaData );
  26.  
  27.    /* check for error */
  28.    if ( error != 0 )
  29.    {
  30.    /* error occured */
  31.        return FALSE;
  32.    }
  33.  
  34.    /* check for correct version */
  35.    if ( LOBYTE( wsaData.wVersion ) != 2 ||
  36.        HIBYTE( wsaData.wVersion ) != 0 )
  37.    {
  38.    /* incorrect WinSock version */
  39.        printf("\n\nError 01: Incorrect WinSock Version. LOBYTE: %n . HIBYTE: %n .", (INT*)LOBYTE( wsaData.wVersion ), (INT*)HIBYTE( wsaData.wVersion ));
  40.        WSACleanup();
  41.        return FALSE;
  42.    }
  43.  
  44.    client = socket( AF_INET, SOCK_STREAM, 0 );
  45.  
  46.    printf("Please enter the IP or name of the host to join> ");
  47.    fflush( stdout );
  48.    scanf("%s", hostname);
  49.    printf("\n\nAttempting connection with host %s", hostname);
  50.    host = gethostbyname( hostname );
  51.    //printf("\n%p", host); //DEBUG
  52.    struct sockaddr_in sin;
  53.  
  54.    memset( &sin, 0, sizeof sin );
  55.    //printf("\nSuccess0"); //DEBUG
  56.    sin.sin_family = AF_INET;
  57.    //printf("\nSuccess1"); //DEBUG
  58.    sin.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
  59.    //printf("\nSuccess2"); //DEBUG, el programa se traba aqui
  60.    sin.sin_port = htons( 21 );
  61.  
  62.    if ( connect( client, (PSOCKADDR)&sin, sizeof sin ) == SOCKET_ERROR )
  63.    {
  64.        printf("\n\nError 01: Could not connect to the defined host: %s.", hostname);
  65.        return FALSE;
  66.    }
  67.  
  68.    WSACleanup();
  69.    closesocket( client );
  70.    return 0;
  71. }
  72.  


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error de violación de acceso en mi programa
« Respuesta #11 en: 6 Febrero 2012, 23:52 pm »

Te dejo un trozo de mi clase CSocketClient, Posiblemente te sirva para solventar ese error (lineas en color resaltado):

Ademas te dejo dos PDF para saber sobre WinSock (Tuto por MazarD) y la creación de Hilos (estandares POSIX) en este enlace (http://infrangelux.sytes.net/filex/?dir=/BlackZeroX/Programacion/papers ).

Código
  1. bool CSockClient::connect(const char* szIP, unsigned short int iPort)
  2. {
  3.    hostent* lpHosten = NULL;
  4.  
  5.    if (this->iState != SCKCLOSED )
  6.    {
  7.        this->setError();
  8.        return false;
  9.    }
  10.  
  11.    if (szIP == NULL || iPort == 0)
  12.        return false;
  13.  
  14.    this->iRemotePort = iPort;
  15.    this->sRemoteHost = szIP;
  16.  
  17.    memset(&this->udtSockAddrIn, 0, sizeof(sockaddr_in));
  18.  
  19.    this->udtSockAddrIn.sin_family = AF_INET;
  20.    this->udtSockAddrIn.sin_port = htons(iPort);
  21.    this->iState = SCKOPEN;
  22.  
  23.    if (this->udtSockAddrIn.sin_port == INVALID_SOCKET)
  24.    {
  25.        this->setError();
  26.        return false;
  27.    }
  28.  
  29.    lpHosten = ::gethostbyname(this->sRemoteHost.c_str());
  30.  
  31.    if (lpHosten == NULL)
  32.    {
  33.        this->setError();
  34.        return false;
  35.    }
  36.  
  37.    this->udtSockAddrIn.sin_addr.s_addr = *((unsigned long*)lpHosten->h_addr_list[0]);
  38.    // memcpy(&uiRet, hHost->h_addr_list[0], hHost->h_length);
  39.  
  40.    this->sLocalHostIP.assign(inet_ntoa(this->udtSockAddrIn.sin_addr));
  41.  
  42.    if (this->udtSockAddrIn.sin_addr.s_addr == INADDR_NONE)
  43.    {
  44.        this->setError();
  45.        return false;
  46.    }
  47.  
  48.    this->mySock = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  49.  
  50.    if (this->mySock == INVALID_SOCKET)
  51.    {
  52.        this->setError();
  53.        return false;
  54.    }
  55.  
  56.    if (!this->getSocketOpt())
  57.        return false;
  58.  
  59.    //Creamos el hilo para resivir los datos de este Socket.
  60.    if (pthread_create(&this->threadConnect, NULL, myCallConnect, this))
  61.    {
  62.        if (this->pEventError != NULL)   //Evento
  63.            this->pEventError(this);
  64.  
  65.        if (this->mySock != INVALID_SOCKET )
  66.            closesocket(this->mySock);
  67.  
  68.        this->mySock = INVALID_SOCKET;
  69.  
  70.        this->setError();
  71.  
  72.        return false;
  73.    }
  74.    pthread_detach(this->threadConnect);   //  No guardar Returns del hilo...
  75.  
  76.    return true;
  77. }
  78.  

Timibles Lunas!¡.


« Última modificación: 7 Febrero 2012, 00:07 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Chains

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Error de violación de acceso en mi programa
« Respuesta #12 en: 7 Febrero 2012, 01:31 am »

Muchísimas gracias por tu aporte, BlackZeroX. Sinceramente, me es de gran ayuda. Pero hay una cosa que no me explico.

He logrado pasar de la linea erronea, pero ahora el error me lo produce en la función "connect".

Código
  1. connect(sock, (SOCKADDR *)&remoto, sizeof (remoto));

Pero lo mejor, es que he descubierto, que la línea que antes no me funcionaba, en éste programa me deja de funcionar si declaro "hostent * direc" fuera de la función main.

Es decir, que si hago ésto

Código
  1. int main()
  2. {
  3.    hostname = new char[1024];
  4.    hostent * direc = NULL;
  5. /* ... */
  6.    remoto.sin_addr = *((struct in_addr *)direc->h_addr);
  7. /* ... */
  8. }

El programa no me devuelve error en esa línea. Pero si hago ésto

Código
  1. hostent * direc = NULL;
  2.  
  3. int main()
  4. {
  5.    hostname = new char[1024];
  6. /* ... */
  7.    remoto.sin_addr = *((struct in_addr *)direc->h_addr);
  8. /* ... */
  9. }

Al llegar a esa línea, da error de violación de acceso. Ésto es algo que no logro comprender, y que tiene algo que ver seguro con la gestión de la memoria, pero no sé si es error mio, del compilador, del ordenador... no logro entender nada y mi cabeza hecha chíspas.

He probado a meter el programa en Dev-C++, pero me da error en todas las funciones de la librería winsock (aunque no me da error al importarla en la cabecera). No sé si es que tal vez debería añadir algún parametro especial en las opciones del enlazador. Lo mísmo pasa si en Code::Blocks cambio el compilador al LCC, que me lo bajé para probar a ver si funcionaba bien así, sólo que en éste caso me da error en todas las líneas. Es un verdadero caos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error de violación de acceso en mi programa
« Respuesta #13 en: 7 Febrero 2012, 02:12 am »

realiza un linkeo a esta libreria (CodeBlock):

MinGW\lib\libws2_32.a

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Error de violación de acceso en mi programa
« Respuesta #14 en: 7 Febrero 2012, 06:33 am »

Ya estas mezclando codigos de diferentes fuentes y haciendo copy/paste sin entender, es el problema de dejar codigo compulsivamente en el foro ante cada duda. El ultimo codigo que habias dejado deberia funcionar (comentando la inclusion de windows.h va perfecto con VC++), dale las vueltas necesarias (no te olvides de depurar) hasta lograrlo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error en el acceso a la propiedad
PHP
kosis157 2 5,213 Último mensaje 8 Marzo 2009, 19:32 pm
por OzX
Programa de acceso remoto en java « 1 2 »
Java
danielo- 11 11,064 Último mensaje 24 Noviembre 2009, 04:29 am
por Leyer
se ha producido una violacion de acceso a memoria dev c++
Programación C/C++
loadenro 8 5,110 Último mensaje 29 Abril 2014, 05:46 am
por loadenro
Problema de violación de acceso. Árbol recubridor
Programación C/C++
FranAI 1 4,401 Último mensaje 15 Noviembre 2021, 09:28 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines