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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18
31  Programación / .NET (C#, VB.NET, ASP) / Destructores y finalizadores en C++/CLI en: 22 Agosto 2014, 14:38 pm
Hola a todos. Escribo para comprobar si yo he entendido bien lo que son los destructores y los finalizadores en C++/CLI y cuál es su cometido.

Entiendo que el finalizador borra los recursos no administrados y el destructor borra los administrados y llama al finalizador (borra todo vamos).

Tengo dudas con variables estáticas y clases Singleton, expongo un pequeño ejemplo y me corregís.

Código:
ref class A{
public:
static A^ getInstance(){
if(INSTANCE==nullptr)
INSTANCE=gcnew INSTANCE();
return INSTANCE;
}

void destroyInstance(){
delete INSTANCE;
}

...
private:
int n;
char **c;
unsigned char *d;
String ^str;
Int32 ^intptr;
array<String^> ^aS;
Int32 num;

A(){
this->n=0;
this->c=new char*[10];
for(int i=0;i<10;i++) this->c[i]=new char[100];
this->d=new unsigned char[20];
this->str=gcnew String("A");
this->intptr=gcnew IntPtr();
this->aS=gcnew String^[100];
for(int i=0;i<100;i++) this->aS[i]=gcnew String();
this->num=1;
}

!A(){
for(int i=0;i<10;i++){
delete[] this->c;
this->c=NULL;
}
delete[] this->c;
this->c=NULL;
delete[] this->d;
this->d=NULL;
}

~A(){
this->!A();
delete this->str;
this->str=nullptr;
delete this->intptr;
this->intptr=nullptr;
for(int i=0;i<100;i++){
delete this->aS[i];
this->aS[i]=nullptr;
}
}
}

PD. Para recursos estáticos, tanto administrados como no, ¿exactamente igual?

Gracias, saludos.
32  Programación / Programación C/C++ / Re: Problema leer/escribir puerto serie (C++ WINAPI) en: 20 Agosto 2014, 10:41 am
Ok, gracias.
33  Programación / Programación C/C++ / Re: Problema leer/escribir puerto serie (C++ WINAPI) en: 19 Agosto 2014, 14:40 pm
Ok, gracias de nuevo.

Entonces tengo otra duda:
Tengo que tener un hilo escuchando constantemente al serie. Esto en principio parece fácil porque ReadFile() es bloqueante, de manera que dejo al hilo en un bucle "infinito"
haciendo esta operación.

El problema es que, en algunos momentos, el programa tendrá que escribir y leer cosas en el serie, entonces la manera de hacer esto sería:
1 - Decirle al "hilo escuchador" que pare de escuchar y espere hasta nueva orden (con un evento por ej.)
2 - Realizar las operaciones de lectura/escritura.
3 - Decirle al hilo que vuelva a empezar a escuchar.

Bien, lo que no tengo claro como hacer es, estando el hilo bloqueado por el ReadFile(), conseguir que salga de ese bloqueo.

NOTA: EL hilo del que hablo, no es de la API de windows, es el del .Net Framework, quizá una posibilidad sería esta:

Código:
...
bool shouldStop=false;
ManualResetEvent ^mre=gcnew ManualResetEvent(false);
...

void warningListener(){
while(!stop){
try{
ReadFile(...);
//Hacer algo...
}catch(ThreadInterruptException ^ie){
mre->WaitOne();
}
}
}

Pero no se si al hacer Thread.Interrupt() estando el hilo bloqueado, saltará alguna excepción...

Saludos, gracias.
34  Programación / Programación C/C++ / Re: Problema leer/escribir puerto serie (C++ WINAPI) en: 19 Agosto 2014, 11:03 am
Hola de nuevo, gracias por la respuesta.

Entonces de momento no haré nada asíncrono. Pero me queda una pregunta, se supone que ReadFile() no es bloqueante, es decir, si hago ReadFile() y el serie no escribe nada, continúa la ejecución del programa, no se queda ahí esperando para siempre.

Entonces ¿qué pasa si le mando algo al serie y antes de que le de tiempo a escribir yo hago ReadFile() ? ¿Hay alguna manera de esperar con ReadFile() un tiempo determinado, y después seguir?
Se qué se puede configurar el serie con timeouts por lo que he leído, pero no entiendo muy a qué se refiere, si a cerrar el serie tras un tiempo o a lo que digo yo.

Gracias, saludos.
35  Programación / Programación C/C++ / Re: Problema leer/escribir puerto serie (C++ WINAPI) en: 18 Agosto 2014, 13:09 pm
Si, justo lo acabo de leer lo del error, gracias.

[INNECESARIO]
El caso es que ahora si he podido leer y escribir, pero la función ReadFile() siempre me devuelve 0 (error) y no entiendo por qué. EDITO: Se me había olvidad añadir el "return Exit_Success" en caso de que todo fuese bien .... "
[/INNECESARIO]

Realmente creo que quizá no necesite usarlo de manera asíncrona, explico lo que tengo que hacer:

1 - Por un lado, enviar a la máquina conectada al serie señales para setear algunos parámetros (como por ej. temperaturas de peligro y no-peligro).

2 - Además, quiero tener un hilo en background escuchando "constantemente" (osea cada x milis) al puerto serie, porque esta máquina envía una señal si se alcanza una temperatura designada como "peligrosa" y vuelve a mandar una señal si se vuelve a la temperatura "no-peligrosa".

Entonces para el segundo punto si que necesito lo asíncrono, ¿cierto?

Gracias, saludos.

36  Programación / Programación C/C++ / Problema leer/escribir puerto serie (C++ WINAPI) en: 18 Agosto 2014, 12:22 pm
Hola a todos.

Estoy intentando hacer una clase con la funcionalidad básica (abrir,cerrar,leer,escribir) para manejar el puerto serie.
Esto es debido a que el puerto serie que tengo que usar lo genera "virtualmente" un programa y la clase SerialPort del .NET Framework no consigue ni abrirlo. (Pregunté en foros de microsof (msdn) y me dijeron que tenía que hacerlo con la WINAPI).

Tras hacer la clase y probarla, he conseguido abrir el puerto y cerrarlo bien. El problema es que no consigo leer ni escribir. En ambas operaciones, si hago "GetLastError()" el error resultante es 997, que según microsoft es: ERROR_IO_PENDING - Overlapped I/O operation is in progress.
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681388(v=vs.85).aspx)

NOTA: si llamo a las funciones de lectura / escritura con el parámetro LPOVERLAPPED como NULL, el código de error (GetLastError) es 87 (el parámetro es incorrecto), el mismo error que tuve cuando traté de usar la clase Net Framework SerialPort.

Adjunto el código de la clase (solo el cpp, el .h no lo veo necesario):
Código:
#include "StdAfx.h"
#include "SerialPort_WINAPI.h"

/*** Atributos constantes definidos en el .h ***/
const wchar_t *const SerialPort_WINAPI::DEFAULT_PORT_NAME = L"COM6";
static const wchar_t *const DEFAULT_PORT_NAME; //Inicializado en el cpp.
static const DWORD BAUD_RATE = 9600;
static const BYTE STOP_BITS = 1;
static const BYTE PARITY = 0; //0==None
static const BYTE DATA_BITS = 8;
static const DWORD HANDSHAKE = 0x00;

SerialPort_WINAPI::SerialPort_WINAPI(void){

}

SerialPort_WINAPI::~SerialPort_WINAPI(void){

}

SerialPortErr SerialPort_WINAPI::openConnection(){
port = CreateFile(SerialPort_WINAPI::DEFAULT_PORT_NAME, //\\\\.\\COM4"
GENERIC_READ | GENERIC_WRITE,
0,    // exclusive access
NULL, // default security attributes
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
if (port == INVALID_HANDLE_VALUE)
return Create_File_Err;

if (GetCommState(port, &portConfig) == 0){
closeConnection();
return Get_Comm_State_Err;
}

initData();
if (SetCommState(port, &portConfig) == 0){
closeConnection();
return Set_Comm_State_Err;
}

if (SetCommMask(port, EV_DSR) == 0){ //EV_CTS | EV_DSR
closeConnection();
return Set_Comm_Mask_Err;
}

initOverlapped();
portEvents.hEvent = CreateEvent(
NULL,   // default security attributes
TRUE,   // manual-reset event
FALSE,  // not signaled
NULL    // no name
);

return Exit_Success;
};

void SerialPort_WINAPI::initData(){
portConfig.BaudRate = BAUD_RATE;
portConfig.fRtsControl = HANDSHAKE;
portConfig.Parity = PARITY;
portConfig.ByteSize = DATA_BITS;
portConfig.StopBits = STOP_BITS;
};

void SerialPort_WINAPI::initOverlapped(){
portEvents.Internal = 0;
portEvents.InternalHigh = 0;
portEvents.Offset = 0;
portEvents.OffsetHigh = 0;
};

SerialPortErr SerialPort_WINAPI::closeConnection(){
SetCommMask(port,0);
if (CloseHandle(port) == 0)
return Close_Err;
return Exit_Success;
};

SerialPortErr SerialPort_WINAPI::read(char *buffer,int length,LPDWORD read){
if(!ReadFile(this->port,buffer,length,read,&this->portEvents)){
return Read_Err;
}
}

SerialPortErr SerialPort_WINAPI::write(char *buffer,int nBytesToWrite,LPDWORD write){
if(!WriteFile(this->port,buffer,nBytesToWrite,write,&this->portEvents)){
return Write_Err;
}
}

Y aquí el main:
Código:
int main(){
SerialPort_WINAPI sp;
char readBuffer[128];
DWORD read;
char writeBuffer[10];
DWORD write;
for(int i=0;i<10;i++) writeBuffer[i]='a';

SerialPortErr err=sp.openConnection();
if(err!=Exit_Success){
cout<<"open: "<<(int)err<<endl;
return -1;
}else{
cout<<"Openned..."<<endl;
}

err=sp.write(writeBuffer,10,&write);
if(err!=Exit_Success){
cout<<"write: "<<GetLastError()<<endl;
}

err=sp.read(readBuffer,128,&read);
if(err!=Exit_Success){
cout<<"read: "<<GetLastError()<<endl;
}


err=sp.closeConnection();
cout<<"close: "<<(int)err<<endl;
return 0;
}

He estado intentando aprender a usar esta API para el puerto serie, pero aunque he leído algunos ejemplos etc. hay muchas cosas que no entiendo.
Por ej. : ¿OVERLAPPED sirve para añadir funciones de callback a distintos eventos del puerto serie, como leer o escribir?

Gracias y saludos.
37  Programación / Programación C/C++ / Re: Duda con destructores en C++ en: 16 Agosto 2014, 16:57 pm
Ok, gracias por la respuesta.

Saludos.
38  Programación / Programación C/C++ / [SOLUCIONADO] Duda con destructores en C++ (que borrar y que no) en: 16 Agosto 2014, 13:58 pm
Hola a todos.

Tengo una duda con destructores en C++, y es que en todos los tutoriales que he leído, en el destructor se borran solo aquellas variables miembro que son punteros, y no entiendo del todo por que no se borran todas las demás variables. ¿Es porque las variables no punteros no se reservan  mediante 'new' y por ello se borran automáticamente?

Ej.
Código:
class A{

private:
  int n;
  char *c;

public:
  A(){
       this->n=0;
       this->c=new char[20];
  }

  ~A(){
       delete[] this->c;
       this->c=NULL;
      //¿delete this->n? <== ¿Hay que hacer esto?
   }
}

Gracias, saludos.

PD. El operador 'delete' es para variables que se reservaron con el operador 'new', y 'delete[]' para las que se reservan mediante 'new[]', ¿esto es cierto SIEMPRE?

 
39  Programación / Programación C/C++ / Re: Duda con volatile en: 7 Agosto 2014, 00:31 am
Entendido, gracias por las respuestas.
40  Programación / Programación C/C++ / Re: Duda con volatile en: 6 Agosto 2014, 13:54 pm
Hola de nuevo, gracias por las respuestas.

Respecto a la primera, no se muy bien qué es compilar en Release. Y sí que cambio la variable 'shouldStop' una vez, pero desde un hilo distinto al que ejecuta el while. Pensaba que esta era una de las situaciones donde entra la utilidad de 'volátile'.

Respecto a la segunda respuesta, utilizo el compilador de visual C++ 2013. Es verdad que no tenía las opciones de optimización activadas, así que he probado a activarlas.
Sigue funcionando bien (y por bien entiendo que el bucle para) sin usar volatile pero, no se por qué, al hacer "cin>>c" me da error el programa, pero ese tema será ya para otro post sobre el compilador de visual c++.

Como conclusión, parece que 'volatile' ha perdido importancia, al igual que 'register'.

Dicho todo esto, mi pregunta es si puede ser buena idea utilizar el modificador 'volatile' si sospechas que cierta variable puede dar problemas alguna vez.

(Y por alguna vez entiendo que otra persona en un futuro pueda modificar tu código, o utilizar otro compilador, o el mismo pero con otros flags de optimización, o versiones nuevas del mismo compilador.)

Gracias y saludos.
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines