Cómo determina vb winsock la finalización del envío, el nombre del archivo de envío y la integridad
No sé si su winsock es el protocolo udp o el protocolo tcpip
El siguiente es un ejemplo que escribí. Estoy usando el protocolo udp y es posible que los datos que envía no se reciban correctamente.
¿Entonces hice la verificación?
'Aquí está el archivo a enviar
Option?Explicit
Dim?GetFileNum?As?Integer,?LenFile?As?Long,?SendByte()? ¿Como?Byte?'Paquete enviado
Privado?Sub?Command1_Click()
¿Activado?Error?Reanudar?Siguiente
Comando1.Enabled?=?False
GetFileNum?=?FreeFile?'Obtener el número del archivo no utilizado
LenFile?=?FileLen(Text1.Text)?Obtener la longitud del archivo a transferir
Si?Texto2.Texto?=?"" ?O?Derecha(Izquierda(Texto2.Texto,?2),?1)? <>?" :"?Entonces?Texto2.Texto?=?Texto1.Texto
Winsock0.SendData?"#SEND?STA#"?//"? &?Text2.Text
Wt?0.5
¿Abrir?Text1.Text?For? ¿Binario? ¿As? #GetFileNum? 'Abrir el archivo a transferir
¿Llamar?TCPSendFile(Winsock0,?GetFileNum,?GetFileNum,?SplitFile)?Enviar archivo
Me.Caption? =?Ahora
p>Ti.Enabled?=?True
Fin?Sub
Privado?Sub?Command2_Click()
¿Descargar?Yo
Fin?Sub
Privado?Sub?Form_Load()
Dim?A?As?String
¿Activado? ¿Error?Reanudar?Siguiente p>
Comando2.Top?=?-2000
Winsock0.RemoteHost?=?IPX?'Serverip
Winsock0.RemotePort?=? FilePort
End?Sub
Private?Function?SplitFile() As?Long? Para mayor claridad, los siguientes dos subprocesos se utilizan para completar el cálculo de cuántos Esta vez se pueden transmitir bytes de datos y la transmisión de datos
¿Activado?Error?Reanudar?Siguiente
Dim?GetCount?As?Long
Si? ¿LenFile?>=?¿Entonces? "Calcule el número de bytes que se pueden enviar esta vez
GetCount?=?4000
LenFile?=?LenFile?-?GetCount
Else p>
GetCount?=?LenFile
LenFile?=?LenFile?-?GetCount
Else
GetCount?=?LenFile?GetCount p>
¿Fin?Si
SplitFile=?GetCount
Fin?Función
Private?Sub?TCPSendFile(objWinSock como Winsock,?FileNumber? como Entero, ¿SendLen? Tan largo)
¿Activado?¿Error?¿Reanudar?Siguiente
¿Atenuado?FileByt.
e()? como Byte, I? como Largo, j? como Largo,? 4
ReDim?SendByte(0)
ReDim?FileByte(SendLen?1)
Temp?=?SendLen?+?7
SendByte?=?Temp?' envía un valor de longitud negativo al encabezado
Get?#FileNumber,?,? FileByte ? 'Leer archivo
ReDim?Preserve?SendByte(SendLen?+?7)?Agregar el encabezado + al encabezado del archivo
For?I?=?0?To? UBound (FileByte)
SendByte(I?+?7)? =?FileByte(I)
'DoEvents
Siguiente
Winsock0 .SendData?SendByte
Fin?Sub
Privado?Sub?Form_Unload(Cancelar?As?Integer)
¿Encendido?Error?Reanudar?Siguiente p >
Winsock0.Close
Err.Clear
Fin?Sub
Privado?Sub?TEnd_Timer()
Activado ? Error Reanudar siguiente
Winsock0.SendData?"#END#"
Err.Clear
End.Sub
Private.Sub . Ti_Timer()
On.Error.Resume.Next
Winsock0.SendData?"#ERR#"
Fin?Sub
¿Privado?Sub?Winsock0_DataArrival(ByVal?BytesTotal?As?Long)
¿Encendido?
Dim?S?As?String
Winsock0.GetData?S
Seleccionar?Caso?S
Caso?"ok"?Continuar enviando exitosamente
Si?LenFile?=?0?Entonces 'Envío completado
p >
If?S?<>?"#Then, Winsock0.SendData?"#SEND?END#"
Me.Caption?=?"¡El archivo se cargó correctamente! "
Comando1.Enabled?=?True
Ti.Enabled?=?False
TEnd.Enabled?=?True
¿Salir?Carga de archivo completada: ["? &?Left((FileLen(Text1.Text)?-?LenFile)?/?FileLen(Text1.Text)?*?100,?4)?%]"
¿Fin? Si
Llamar?TCPSendFile(Winsock0,?GetFileNum,?SplitFile)
Caso?"#END#"
TEnd.Enabled? =?False
FMain..TiF.Enabled?=?True
Case?"no"?Reenviar el paquete anterior sin éxito
Winsock0.
End.Select
End.Sub
'El siguiente es el archivo recibido
Option.Explic
it
Dim.FOK.As.Boolean,.Fs.As.Long,.FileNumber.As.Integer,.LenFile.As.Long?La longitud del archivo
Privado ?Sub ?Command1_Click()
¿Descargar?Yo
Fin?Sub
¿Privado?Sub?Command2_Click()
¿Encendido?Error ?Reanudar ?Siguiente
Dim?A?As?String
Me.Caption?=?" Iniciar descarga"
Me.Caption?Iniciar descarga"
If?Dir(Text2.Text)?<>?"" And?ChV.Value?=?0?Then
If?MsgBox("El archivo ya existe, ¿sobrescribirlo? " , ?vbCritical?+?vbYesNo)? =?vbYes?Entonces?Kill?Text2. De lo contrario, salga de Sub
Else
Kill?Text2.Text
Fin ?If
If?Text2.Text?=?"" ?Then?Text2.Text?=?Text1.Text
'Command2.Enabled?=?False p>
Si?Ch.Value?=?0?Entonces?A?=?" #DOW#"?#DOW#""¿Else?A?=?"
FMain.Wsk. ¿EnviarDatos?&?Text1.Text
Wt?1
FMain.Wsk.SendData?"#DOE#"? ¿Fin? Sub
Privado?Sub?Form_Load()
Dim?A?As?String
'FMain.Ts.Enabled?=?True
p>
¿Error?Continuar con el siguiente paso
Si FMain.Cb.Text?=?"Grupo local"?O?FMain.Cb.Text?=?"Entonces
Me.Caption?=?"Vuelva a seleccionar el usuario de descarga ["Grupo" no se puede descargar correctamente]"
Else
Command1.Top?=?-2000
Winsock0.LocalPort?=?FilePort
Winsock0.Bind
¿Fin?Si
Fin?Sub
¿Privado?Sub?Form_Unload (¿Cancelar?Como?Integer)
Privado?Integer)
¿Activado?Error?Reanudar?Siguiente
Winsock0.Close
Err .Clear
Fin?Sub
Privado?Sub?La_Click()
CDL.FileName?FileName=?"
CDL .ShowOpen
Text2.Text?=?CDL.FileName
Fin?Sub
Privado?Sub?Winsock0_DataArrival(ByVal?bytesTotal?As ?Long)
Activado?Error?Reanudar?Siguiente
Dim?FileByte()?As?Byte,?A?es una cadena, reparar
Byte()? es byte, I? es largo, J? es largo, Temp? es cadena, W? es cadena
Winsock0.GetData?FileByte,?vbArray?+?vbByte?' matriz de bytes
J?=?UBound(FileByte)?Obtener la longitud del paquete
For?I?=?0?To?7?Step?2?' p>
Temp?=?Temp?&?Chr(FileByte(I))
Siguiente
Para?I?=?0.0?To 9?Fin del envío del archivo. etiqueta
A =?A &?Chr(FileByte(I))
Siguiente
Si?#Entonces, Winsock0.SendData "No" p>
Si?A?=?"#Entonces
For?I?=?0?To?Len(FMain.TIn.Text)
Si?I? 100?Entonces
W?=?Left(Right(FMain.TIn.Text,?I),?1)
¡Si?!"Entonces
W =?Left(Right(FMain.TIn.Text,?I?+?4),?5)
¿Salir?Para
¿Fin?
Si no
¿Salir? Para
¿Fin? Si
¿Siguiente? Yo
¿Si? ¡Descarga completada! "Entonces
FOK=?¡Descarga completada! ["? &?Text2.Text?&?"]" ¡Descarga completada! " ?
FMain.TIn.Text?=?FMain.TIn.Text?["? &?¿Ahora?&?"]" &?"
FMain.TIn. Text?=?FMain.TIn.Text?&?Descarga completada! ("? &?Fs? &?" <="?&?LenFile?&?")" ? &?vbCrLf
Command2 .Enabled?=?True
End?If
Else
If?Val(Temp)? =?J?'Comparar longitudes para ver si se perdieron los paquetes
ReDim?
For?I?=?0?To?J?-?8? 'Presentar encabezado del paquete
MendByte(I) ? =?FileByte(I?+?7)
Siguiente
Fs?=?Fs?+?UBound(FileByte)?-?7
Poner ?#FileNumber,? ,?MendByte?'Escribir archivo
Winsock0.SendData?"ok"?Enviar una solicitud para continuar enviando
Me.Caption?=?"Descarga de archivo completada : ["? &?Left(Fs?/?LenFile?*?100,?4)? &?" %]"
Else
If?Left(A,? 10 )? =?"#Entonces
A=?""
¿Para?I?=?10?A?UBound(FileByte)?La marca de envío del archivo finaliza
A?=?A?&?Chr(FileByte(I))
Siguiente
LenFile?=?Val
(Left(A,?InStr(A,?" //")?-?1))
For?I?=?0?To?Len(Text2.Text)
A?=?Left(Right(Text2.Text,?I),?1)
Si?\Entonces salga para
Siguiente
Si Dir(Left(Text2.Text, Len(Text2.Text)?Text2.Text,?Len(Text2.Text)? -luego, MkDir(Left(Text2.Text,?Len(Text2.Text)?
'"#SEND?STA#"?//"? &?Text2.Text
FileNumber?=?FreeFile?'Obtener número de archivo no utilizado
Fs?= ? 0
¿Abrir?Texto2.Texto?Para?Binario?¿Como?#NúmeroDeArchivo?'Abrir archivo
De lo contrario
Si?A?#Entonces
p>Winsock0.SendData?"no"?Se produce pérdida de paquete, solicitud para reenviar
Else
Winsock0.SendData?"#END#"?Enviar solicitud para continuar
Cerrar #NúmeroDeArchivo
Restablecer
Si FOK?=?¡Descarga completada ["? &?Text2.Text?&?"]"
FMain.TIn.Text?=?FMain.TIn.Text?["? &?Now?&?"]" ? &?"
FMain.TIn.Text?=?FMain .TIn.Text?&?Descarga completada! ("? &?Fs? &?" <="?&?LenFile?&?")" ? &?vbCrLf
Command2.Enabled?=? Verdadero
De lo contrario
FOK?=?Falso
¿Fin? ¿Fin?