|
181
|
Programación / Programación Visual Basic / Re: ayuda con wininet
|
en: 17 Junio 2009, 08:23 am
|
buenas de nuevo, era una tontería pero no acababa de verlo. Tenía que cerrar los handles abiertos a findfirstfile y findnext file antes de vovlver a usarlos. Private Declare Function InternetCloseHandle Lib "wininet.dll" _ (ByVal hInet As Long) As Integer
InternetCloseHandle (first_file) InternetCloseHandle (next_file)
saludos
|
|
|
182
|
Programación / Programación Visual Basic / ayuda con wininet - solucionado
|
en: 16 Junio 2009, 17:52 pm
|
Buenas, trato de hacer un cliente FTP usando el API wininet y me he quedado un poco atascado... En un form tengo 4 textbox para introducir el server, el puerto, el user y el pass, un botón para conectar al server y un listbox para listar los archivos y carpetas que contiene. Cuando conecto, me lista correctamente los archivos y carpetas que contiene el server FTP en la carpeta principal, pero cuando intento abrir una de estas carpetas y listar su contenido (haciendo doble click sobre ella) me devuelve 0, como si estuviese vacía, cuando no lo está. Dejo el código que tengo y si alguno me pudiese orientar le estaría muy agradecido. Option Explicit
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _ ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _ (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, _ ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, _ ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _ (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _ lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long
Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _ (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Public Const INTERNET_SERVICE_FTP = 1 Public Const INTERNET_FLAG_PASSIVE = &H8000000
Dim hOpen As Long Dim hConnection As Long Dim server As String Dim port As Integer Dim user As String Dim pass As String Dim first_file As Long Dim next_file As Long Dim datos As WIN32_FIND_DATA
Private Sub Command1_Click()
hOpen = InternetOpen("MiFTP", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) DoEvents
server = ftp_server.Text port = CInt(ftp_port.Text) user = ftp_user.Text pass = ftp_pass.Text
hConnection = InternetConnect(hOpen, server, port, user, pass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0) DoEvents
first_file = FtpFindFirstFile(hConnection, vbNullString, datos, 0, 0) If first_file <> 0 Then List1.AddItem datos.cFileName next_file = InternetFindNextFile(first_file, datos) Do While next_file <> 0 List1.AddItem datos.cFileName next_file = InternetFindNextFile(first_file, datos) DoEvents Loop End If End Sub
Private Sub List1_DblClick()
Label6.Caption = Label6.Caption & "/" & List1.List(List1.ListIndex) List1.Clear If FtpSetCurrentDirectory(hConnection, Label6.Caption & "/") <> False Then
first_file = FtpFindFirstFile(hConnection, vbNullString, datos, 0, 0) If first_file <> 0 Then List1.AddItem datos.cFileName next_file = InternetFindNextFile(first_file, datos) Do While next_file <> 0 List1.AddItem datos.cFileName next_file = InternetFindNextFile(first_file, datos) DoEvents Loop End If End If End Sub
|
|
|
183
|
Programación / Programación Visual Basic / Re: Duda al cerrar el csocketplus
|
en: 10 Junio 2009, 19:58 pm
|
hola mariana, y gracias por contestar ya he intentado eso de intentar controlar el estado con un timer y en caso de que state<>cskconnected que lo quite de la lista de servers conectados, pero creo que al haberse desconectado el csocket del server, el index del array de csockets del cliente, se descarga, como si hiciese csocket.arrayremove(n) (por lo que me ha parecido entender en las instrucciones del módulo), y me da un error de que no existe ese index. de momento con el evento (si es que se dice evento ) error , cada vez que un server se desconecta me da un error con number=0, pero no sé si ese error se produce solo así, o se puede producir por cualquier otra cosa. He intentado buscar en código del csocket de dónde viene ese error=0, pero me viene demasiado grande
|
|
|
184
|
Programación / Programación Visual Basic / Duda al cerrar el csocketplus
|
en: 10 Junio 2009, 00:36 am
|
hola, había hecho un troyano multiconexión usando el control winsock y ahora estoy tratando de usar el módulo csocketplus. La cuestión es que con el winsock, para detectar cuando un server se desconectaba, usaba en el cliente el Private Sub winsock_Close(Index As Integer) , pero con el csocket plus, el Private Sub csocket_CloseSck(ByVal Index As Variant), no me da ninguna respuesta.
No sé si funciona de forma distinta que en el winsock ¿?
Por otra parte, haciendo pruebas he visto que cuando un server se cierra, sí que se detecta con Private Sub csocket_Error(ByVal Index As Variant, ByVal Number As Integer, Description As String, ByVal sCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
dándome un error con nº 0 ¿es ésta la forma de detectar que un server ha cerrado la conexión? o se trata de un error genérico?
Muchas gracias de antemano
|
|
|
185
|
Programación / Programación Visual Basic / Re: como hacer un registro remoto
|
en: 27 Mayo 2009, 17:10 pm
|
hola otra vez, se me ocurre que cuando intentas mandar todas las ramas del registro, una tras otra, el winsock puede saturarse. Yo uso un procedimiento que encontré por algún foro (creo que hacían un explorador de archivos remoto) del que no recuedo el nombre del autor.
Private Sub pausa() 'por un tema de velocidad ya que nuestro micro 'es màs ràpido que nuestra conexiòn crearemos Dim comenzar 'un Procedimiento que hara pausas entre envio y envio, Dim controlar 'asi no atora a Winsock comenzar = Timer Do Until controlar >= comenzar + 0.01 controlar = Timer DoEvents Loop
End Sub
Llamando a este procedimiento en el server, tras la instrucción winsock.sendddata (call pausa), a mi me envía correctamente todas las ramas.
Espero que te sirva. Un saludo.
P.D. Repito que el código no es mío, lo encontré por ahí y siento no recordar el nombre del autor para ponerlo.
|
|
|
186
|
Programación / Programación Visual Basic / Re: como hacer un registro remoto
|
en: 27 Mayo 2009, 01:15 am
|
hola, precisamente yo estoy tratando de hacer algo similar. Si ya tienes el programa hecho no te será muy difícil (lo digo yo que soy un novato javascript:void(0) . lo que yo he hecho ha sido utilizar 3 winsock (para las instrucciones, envio de keys y envío de valores) primero conecto los 3 winsock y la única pega es que el winsock que va a recibir la petición de conexión tiene que tener el index 0, y cuando recibe el connection_request hay que cargar el winsock(1) que será el que funcione. cuando el winsock de instrucciones del server recibe una orden, por ejemplo "HKLM" se ejecuta el api RegOpenKey(HKEY_LOCAL_MACHINE, "", handle_superior) y seguido un bucle con el api RegEnumKeyEx(handle_superior, i, key_name, name_size, ByVal 0&, vbNullString, ByVal 0&, ByVal 0&) que mientras sea 0 mandará al cliente,de una en una, los nombres de las keys de HKLM, por el winsock de keys mediante la instrucción winsock_keys.senddata key_name y según se reciben se llevan a un listbox cuando en el server, se reciben datos por el winsock de keys, será la subey que se quiere explorar del handle abierto anterior, se ejecutaría en el server RegOpenKey(handle_superior, subkey, handle1) para abrir la nueva subkey handle_superior = handle1 para la siguiente key que abramos y de nuevo un bucle con RegEnumKeyEx que se enviaría por winsock_key y además otro bucle con RegEnumValue que se enviaría por winsock_value y en el cliente se añadiría a otro listbox para otras instrucciones como borrar claves, crear nuevos valores y demás, habría que o bien meter más winsocks o jugar con las cadenas que se envían, por ejemplo yo envío junto a cada valor su data y su tipo, y después la separo en el cliente. No sé si te habrá sido de ayuda, leyendo de nuevo el royo que he escrito, la verdad es que ni yo me entero javascript:void(0); , pero la idea es enviar desde el cliente una orden al servidor (winsock_cliente.senddata orden), recoger la orden en el servidor (winsock_servidor.getdata orden),analizar la orden en el servidor (if orden=...then), ejecutar la orden, devolver la salida (winsock_servidor.senddata salida) y recogerla en el cliente (winsock_cliente.getdata salida)
|
|
|
|
|
|
|