![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
A ver, para archivos pequeño he hecho esto y funciona:
Código PHP:
|
|
#2
|
||||
|
||||
|
Bueno, he conseguido transferir archivos aunque no creo que sea del todo correcto lo que hago para conseguirlo
. Primero paso una mascara para indicar que es un envio de archivo y a continuacion mando una estructura donde indico el nombre del archivo, su tamaño, y el número de bloques a enviar. He colocado un Sleep para poder enviar sin perder datos por el camino. Os adjunto el fuente para que si alguien quiere mirarlo y ayudarme a mejorarlo para hacerlo funcionar correctamente pues se lo agradeceria ya que a veces se pierden bytes por el camino aunque la mayor parte de las veces llega el fichero correctamente pero otras veces se queda el receptor esperando como si faltara algun bloque por llegar.Aqui el link |
|
#3
|
||||
|
||||
|
No creo que estés usando el método adecuado. Es mejor que la comunicación sea síncrona y ten en cuenta que los paquetes se pueden unir o separar. No tengo ahora tiempo de realizar un ejemplo. Puedes, también, usar la API TransmitFile
Te dejo un fragmento de código funcional para recibir ficheros por esta vía, previamente debes haber comunicado el tamaño del fichero y nombre a transferir (SizeFile y lpPathName): Código PHP:
|
|
#4
|
||||
|
||||
|
Bueno, te he preparado un rápido ejemplo sobre el chat que te envié antes y sin usar componentes de VCL. Sokets "a pelo".
En el chat, si el cliente envía "Envia Fichero" (sin acento para no confundir caracteres), el servidor envía un fichero llamado Prueba0.bmp que es un bmp grande. El cliente lo recibe y lo guarda como Prueba.bmp. A continuación el server recibe la palabra y sigue la comunicación... Te expongo las funciones que envían y reciben el fichero: TransmitFile.h Código PHP:
Código PHP:
PD/ Borro el anterior chat porque este es idéntico, añadiendo la nueva funcionalidad Saludos. Última edición por escafandra fecha: 24-03-2018 a las 13:09:57. |
|
#5
|
||||
|
||||
|
Amigo he estado haciendo pruebas con la api que comentas pero claro, tu usas un tipo SOCKET y yo intento hacer lo mismo con un TSocketServer y un TSocketClient y la verdad es que todo lo que pruebo acaba retornandome false en TransmitFile. He probado esto:
Código PHP:
Código PHP:
Código PHP:
|
|
#6
|
||||
|
||||
|
Para poder usar la API de winsocket desde los componentes VCL TServerSocket y TClientSocket, debes usar ServerSocket->Socket->SocketHandle o ClientSocket->Socket->SocketHandle
Saludos. |
|
#7
|
||||
|
||||
|
Bueno amigo, he estado viendo el modo en que me indicabas y he modificado mi funcion para que use lo que me indicabas, o sea, uso TransmitFile y una funcion propia llamada ReceiveFile. El problema es que el archivo que recibo es corrupto porque termina la funcion de recepcion pero no recibo todos los bytes. He comprobado que en la funcion ReceiveFile salgo del bucle con el break en vez de salir porque nBytes sea igual a FileSize. Lo que pienso es que se pueden estar perdiendo bytes por el camino pero no tengo ni idea ya que uso TransmitFile y no se como funciona esta por dentro. Adjunto el proyecto por si quereis mirarlo a ver que puede estar pasando.
|
|
#8
|
||||
|
||||
|
Tienes un eror de concepto. Cuando esperas recibir el archivo y se dispara el evento SocketRead, en tu código, primero lees cosas (estructura del archivo, MD5...) con lo que estás perdiendo datos, pues en ese momento ya estás recibiendo los primeros bloques del archivo. Fíjate en este cambio que realizo en tu código y verás que ya funciona. Seguramente este error lo tenías en otras formas de leer tu archivo:
Código PHP:
|
|
#9
|
||||
|
||||
|
Aprovecho para mostrarte como obtener el Hash MD5 de un archivo con la API de Windows tal y como lo utilicé en este ejemplo para cazar un virus: TerminateMD5_Process, a la caza de un virus...
Código PHP:
|
|
#10
|
||||
|
||||
|
Un detalle más que olvidé al publicar la solución a tu problema es que ha añadido un guión bajo al nombre del archivo recibido puesto que se escribe en el mismo path que el original y puede ocurrir una doble apertura del mismo:
Código PHP:
Saludos. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Ellas y Ellos | jcarteagaf | Humor | 1 | 06-08-2011 03:43:05 |
| Llamada entre ventana usando paquetes. | PittyDelphi | OOP | 3 | 27-01-2011 12:28:37 |
| ¿Saben algo de ellos? | roman | La Taberna | 11 | 18-11-2008 18:59:07 |
| Comunicación TCP/IP entre dos programas usando componentes INDY | Roger_Delphi | Internet | 2 | 20-10-2008 14:02:49 |
| Comunicacion entre procesos | walito | Varios | 0 | 14-11-2007 21:55:53 |
|