Autor
		 | 
		
			Tema: Problema transferencia de archivos con winsock  (Leído 3,773 veces)
		 | 
	 
 
	
		
			
				
					
						
							BeRti
							
								
								  Desconectado
								Mensajes: 63
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Wenas. La cosa es que no consigo hacer que funcione correctamente me estoy komiendo la kabeza y fijo que es una gilipoyez lo que me falta pero weno, a ver si me echa una mano alguien y tal.... Salu2 CLIENTE: Private Sub command1_click() Dim fragmento As Integer, ruta As String Dim tamaño As Long Dim contador As Long Dim buffer As String Dim archivo, lectura As String archivo = FreeFile contador = 0 ruta = "C:\hola.jpg" Open ruta For Binary As #archivo tamaño = FileLen(ruta) ws.SendData "enviar|" & ruta & "|" & tamaño & "|"
 
  fragmento = 8192 '8 kb
 
  While contador < tamaño     lectura = Input(fragmento, #archivo) 'Leer 8 kb del archiv     ws.SendData lectura     contador = contador + 8192 Wend Close #archivo End Sub
  SERVIDOR: 'Declaraciones globales: Dim transfiriendo As Boolean Dim ruta As String * 50 Dim tamaño As Long Dim contador As Long Private Sub Ws_DataArrival(ByVal bytesTotal As Long)    Dim datos As String, datos2() As String    ws.GetData datos    If Left(datos, 6) = "enviar" Then    datos2 = Split(datos, "|")    ruta = datos2(1)    tamaño = datos2(2)    transfiriendo = True end sub    End If    If contador < tamaño Then    If transfiriendo = True Then    Open ruta For Binary Access Write As #1    Seek #1, LOF(1) + 1    Put #1, , datos    Close #1    End If    contador = contador + 8192    End If    If contador >= tamaño Then    transfiriendo = False    End If End Sub
  
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita! 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BenRu
							
								The Prodigy 
								       
								
								  Desconectado
								Mensajes: 4.006
								 
								-
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Donde te da el error?
  Nada mas verlo veo que ahi un fallo, un integer no puede almacenar 8192 '8 kb
  Un saludo
  
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BeRti
							
								
								  Desconectado
								Mensajes: 63
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Perdón me expresé mal, keria decir que por internet no funciona bien, los archivos al llegar siempre okupan menos que el original, luego son inservibles, pero en mi pc si que lo kopia korrectamente unas veces y otras no, no lo entiendo... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita! 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							NYlOn
							
								 
								
								  Desconectado
								Mensajes: 842
								
								 
								OOOOHHHHHH, TARAGÜIIII       xDDDDDD
								
								
								
								
								
								  
								 
							 
						 | 
						
							
							 
							
1º Como haces para provarlo con tu propia pc ?? Estas sobreescribiendo el archivo que te llega sobre el que estas mandando, no se si me explico. Vos abris el archivo C:\hola.jpg y le decis al servidor que guarde los datos que le vas a mandar en el archivo C:\hola.jpg, no crea uno nueva. Proba con esto: ruta = "C:\hola.jpg" Open ruta For Binary As #archivo 'Agregar la siguiente linea: ruta = "C:\hola2.jpg"
  2º Tenes un  End Sub en el medio del evento DataArrival del servidor =S No se si es que copiaste mal o que. 3º Podrias provar cambiando el  While por un  For: For i = 0 t Tamaño Step fragmento     lectura = Input(i, #archivo) 'Leer 8 kb del archiv     ws.SendData lectura Next i
  Con respecto a lo que dice  BenRu es cierto que una variable del tipo Integer no puede almacenar 8192 '8 kb pero, ahi hay un apostrofe (comilla, palito) lo que estaria marcando un comentario. Por lo tanto la variable esta almacenando el numero 8192, lo que no generaria un error. No se, fijate en estas cosas, espero que te sean utiles. Y por favor pone en que parte te marca el error, asi es mas facil ayudarte. Un abrazo.-  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BeRti
							
								
								  Desconectado
								Mensajes: 63
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Gracias por responder NYlOn, mira es que lo de que el archivo se llama igual y lo sobreescribe es cierto pero en el proyecto lo habia cambiado, eso ya no era problema. Lo pruebo en mi propio pc ejectuando el server y el cliente y probando, y si que copia el archivo perfectamente. El problema no es que me de errores, sino que al probarlo por intenernet con un amigo, al enviar el archivo que elija, sea hola.jpg que es un ejemplo o sea cualquier otro, nunca llega completo, siempre le faltan unos kuantos KBs, y no tengo ni idea de por que.... por cierto buena idea el for, pero me sigue pasando lo mismo    ... yo kreo que el problema debe estar en el codigo del servidor pero no se que modificar para solucionarlo.... alguna ideA?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita! 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BenRu
							
								The Prodigy 
								       
								
								  Desconectado
								Mensajes: 4.006
								 
								-
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Y para que sirve la variable fragmento pues?
  Recuerda que cuando utilizas el integer solo te recoje 8192, y se queda el 0'12 sin recojerse.
  Un saludo 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							NYlOn
							
								 
								
								  Desconectado
								Mensajes: 842
								
								 
								OOOOHHHHHH, TARAGÜIIII       xDDDDDD
								
								
								
								
								
								  
								 
							 
						 | 
						
							
							 
							
y qu hay de esto:    transfiriendo = True end sub    End If
  Que hace ese  End Sub ahi =S??  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BeRti
							
								
								  Desconectado
								Mensajes: 63
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Vale mirad, ya he conseguido que funcione en mi pc, ejecutando el server y el cliente. pero por intenernet no funciona, siempre el archivo al llegar ocupa menos que el de origen, es komo si se perdiesen paketes.... no se por que pasa... os dejo el codigo que he conseguido hacer: cliente: ( extraido del curso del troyano de fulano, por que el que hice yo funcionaba pero solo aveces :S) Private Sub command1_click() Dim ruta As String Dim tamaño As Long Dim buffer As String ruta = "C:\prueba\d.zip" 'obligatorio de definir la variable si no da error Open ruta For Binary Access Read As #1 tamaño = FileLen(ruta) ws.SendData "enviar|" & ruta & "|" & tamaño & "|" 'abrimos el arxivo en modo binario lectura buffer = Space$(25000) 'le decimos el espacio max que pode ocupar For i = 1 To FileLen(ruta) / 25000 'hacemos la division de las veces que tendra que leer y enviar Get #1, , buffer 'leemos ws.SendData buffer 'enviamos If FileLen(ruta) - Loc(1) <= 25000 Then 'como el for no utiliza los  decimales enviamos los restos buffer = Space$(FileLen(ruta) - Loc(1)) 'redimensianamos la variable con el num de bites que faltan Get #1, , buffer 'leemos ws.SendData buffer 'enviamos End If Next Close #1 End Sub servidor: Dim transfiriendo As Boolean Dim ruta As String * 50 Dim tamaño As Long Dim contador As Long Dim datosg As String Private Sub Ws_DataArrival(ByVal bytesTotal As Long)    Dim datos As String, datos2() As String    ws.GetData datos    If Left(datos, 6) = "enviar" Then    datos2 = Split(datos, "|")    ruta = datos2(1) & "22"    tamaño = datos2(2)    transfiriendo = True    datosg = Mid(datos, Len(datos2(1)) + Len(datos2(2)) + Len("enviar||||"))    
     Else    If Len(datosg) <> tamaño And transfiriendo = True Then    datosg = datosg + datos    End If    If Len(datosg) = tamaño And transfiriendo = True Then    Open ruta For Binary Access Write As #1    Put #1, , datosg    Close #1    transfiriendo = False    datosg = ""    End If    End If End Sub  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita! 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							Ironhorse
							
								
								  Desconectado
								Mensajes: 150
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Que protocolo estas usando? TCP es confiable y orientado a la conexión, UDP no es confiable y no esta orientado a la conexión (confiable quiere decir que se asegura que los paquetes lleguen, y en el orden correcto, o en todo caso si se pierde definitivamente un paquete, se sabe que el paquete se perdio). Tal vez sea esa la causa.
  Saludos 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Pégense una vuelta por Cracton    
						 | 
					 
				 
			 |  
		 
	 |  
	 |  
 
	 
	
 
			 
			   |