border

Miembros:
Mensajes:
Temas:
Online:

Ultimo Miembro:

 
 

Cuenta Bancaria en EEUU
  #1 (permalink)  
Antiguo 29-01-2005, 01:07:13
Gran Participación en el Foro
 
Registrado: feb 2004
Posts: 134
LaNGuiS Valoración +2
Predeterminado Problema al enviar un archivo por winsock

Hola, tengo una aplicacion cliente - servidor.
Para enviar unn archivo uso este codigo.

En el Servidor:


Dim FN As Long
Dim wptr As Long
Dim bytes As Integer
Dim stream As String
FN = FreeFile
strArch = ArchivosSend(1)
Open strArch For Binary As #FN
sasi = Right(strArch, Len(strArch) - InStrRev(strArch, "\", -1, vbTextCompare))
Me.Winsock1(ActIndex).SendData "%" & sasi & "%" & LOF(FN)
DoEvents
wptr = 1
Do Until wptr > LOF(FN)
If ((LOF(FN) - wptr) + 1) > 32766 Then
bytes = 32766
Else
bytes = ((LOF(FN) - wptr) + 1)
End If
stream = String(bytes, " ")
Get #FN, wptr, stream
Winsock1(ActIndex).SendData "@" & stream
DoEvents
wptr = wptr + bytes
Loop
Close #FN

Y en el dataarrival del cliente:

goten = goten + Len(Mid(a, 2, Len(a)))
If goten >= fillen Then
Dim i As Long
Data = Mid(a, 2, Len(a))
ss = FreeFile
Open "c:\" & Arch For Binary As #ss
Put #ss, , Data
Close #ss
fillen = 0
goten = 0
Arch = ""
strReceptor = ""
End If

(estos codigos los saque de un par de post de este foro y lo intente adaptar)

El problema es que por ejemplo yo quiero tranferir un archivo de texto.

-Se crea bien el archivo.
-Cuando hace el "PUT" , Data dice lo que esta en el txt.
Pero cuando uno quiere ver ese txt y lo abre en vez de ver lo que estaba en el archivo original se ve:

"&氮⁡潣据慨搠⁥慬氠牯⁡⁹慬瀠瑵⁡慭牤⹥"

¿Alguien sabe en que estoy fallando?

Gracias.
Responder Con Cita
  #2 (permalink)  
Antiguo 29-01-2005, 08:05:14
Avatar de acalanto
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.308
acalanto ha deshabilitado la reputación
Predeterminado

Fíjate que por una parte estás enviando un encabezamiento tipo

%nombrefichero%&%$&

después paquetes del tipo

@Información contenida en el primer paquete de datos leidos del fichero...


Primer error:

Estás transmitiendo por el socket datos de diferente índole. %nombrefichero% es cadena pero LON(FN) es un long.

Segundo error:

En el equipo que recibe no procesas adecuadamente estos encabezados, simplemente eliminas el primar carávter y lo acumulas en GOTEN para posteriormente grabar ésta en la primera posición del fichero.

Tercer error:

No generas ningún tipo de protocolo de entendimiento para sincronizar la operación y es posible que cuando el equipo que recibe, esté procesando el primer paquete de bytes, el que envía le remite un nuevo paquete con lo cual -y dependiendo de como administre las tareas el sistema operativo- cada vez obtengas un fichero diferente.


Yo en tu caso establecería unas normas de comunicación (Como hacen los servidores de FTP por ejemplo) en el que la parte emisora y la receptora puedan ponerse de acuerdo, y no olvides que un servidor puede tener diferentes hilos por los que se realizan las peticiones, aspecto que debes controlar.

P. Ejemplo

SERVER [TE_ENVIO_UN_FICHERO]
CLIENTE [DAME_SU_NOMBRE]
SERVER <nombredefichero>
CLIENTE [DAME_SU LONGITUD]
SEVER CSTR(LOF(FN))
CLIENTE [ESPERO_PAQUETE]
SERVER <primerpaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER <segundopaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER <tercerpaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER [FIN_DE_FICHERO]

Un equipo no inicia la transmisión mientras la otra parte no le indica que está dispuesto a recibirla mediante dicho protocolo de entendimiento. Además y como te he dicho, necesitas controlar en el servidor las tareas de cada uno de los hilos que pueda tener en funcionamiento, pues si son varios los equipos conectados, estará atendiendo las peticiones de todos ellos y entre el primer paquete de datos de fichero y el segundo, seguramente ha atendido otras solicitudes de otros clientes que, a su vez, están manipulando diferentes ficheros.


Espero hanerme explicado más o menos de forma entendible.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #3 (permalink)  
Antiguo 29-01-2005, 14:46:54
Buena Participación en el Foro
 
Registrado: nov 2004
Posts: 69
imported_HurryCrack Valoración +2
Predeterminado

Una pequeña idea, por que no lo hace a través de FTP? el objeto INET te será de mucha ayuda. La MSDN también.

Un saludo.
Responder Con Cita
  #4 (permalink)  
Antiguo 29-01-2005, 19:59:05
Gran Participación en el Foro
 
Registrado: feb 2004
Posts: 134
LaNGuiS Valoración +2
Predeterminado

Primero que nada muchas gracias acalanto.

ya he echo todo lo que u me indicas y el programa anda mucho mejor

Ahora mi duda es la siguiente.

Cita:
Empezado por acalanto
CLIENTE [ESPERO_PAQUETE]
SERVER <primerpaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER <segundopaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER <tercerpaquetedebytes>
CLIENTE [ESPERO_PAQUETE]
SERVER [FIN_DE_FICHERO]
Segun tengo entendido la velocidad del envio del archivo depende tanto de la subida del server como de la bajada del cliente.

La pregunta es como hago para saber cuantos bytes le tengo que enviar por cada paquete?

No entendi muy bien eso si me puedes dar una manito te lo agradecere 1000 veces mas .

Saludos y gracias.
Responder Con Cita
  #5 (permalink)  
Antiguo 30-01-2005, 08:45:53
Avatar de acalanto
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.308
acalanto ha deshabilitado la reputación
Predeterminado

En principio puedes hacerlo tal y como lo tienes estructurado en el código. Solamente creo que sería oportuno que pruebes el tamaño máximo del paquete (Cámbia el valor 32000 por 2048 por ejemplo). Del resto no te preocupes pues la propia pasarela TCP, se encarga de fragmentar en paquetes más pequeños pero al cliente le llegan tal y como el server ha enviado.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #6 (permalink)  
Antiguo 30-01-2005, 16:32:25
Gran Participación en el Foro
 
Registrado: feb 2004
Posts: 134
LaNGuiS Valoración +2
Predeterminado

Cita:
Empezado por acalanto
En principio puedes hacerlo tal y como lo tienes estructurado en el código. Solamente creo que sería oportuno que pruebes el tamaño máximo del paquete (Cámbia el valor 32000 por 2048 por ejemplo). Del resto no te preocupes pues la propia pasarela TCP, se encarga de fragmentar en paquetes más pequeños pero al cliente le llegan tal y como el server ha enviado.

Muchas gracias amigo !!
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último Mensaje
problema con winsock bezael Visual Basic.NET 2003 & 2005 2 12-03-2006 17:52:02
Winsock enviar e-mail skate_mlk Visual Basic 6.00 1 18-06-2005 06:15:05
transferir archivo con winsock McruzAT Visual Basic 6.00 5 19-10-2004 17:39:46
Enviar mails sin winsock ni mapi MarSoftware Visual Basic 6.00 4 02-03-1970 04:05:10
Enviar detos de una B/D usando winsock Susof Visual Basic 6.00 5 11-02-1970 02:05:07


La franja horaria es GMT. Ahora son las 06:55:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design

Alojado en el servicio Premium de Masquewebs | Diseño mejorado por MasqueWebs

right