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
|
|||
|
|||
Protocolo envío de ficheros entre pcs
Hola de nuevo…
Me está agobiando la realización del programa. Tengo que sincrozar los directorios que hay en un directorio de un servidor con los que hay en un cliente. Para ello tengo que mandar (a trozos) los ficheros al cliente mediante un protocolo inventado por mi… Al final he conseguido hacer esto…que…no hace una m… No he descubierto como mandar al cliente los tozos de bytes con cabecera incluida…así que lo que hago es envíar un texto con la cabecera antes de eviar cada trozo… El caso esque siempre me da error al volver a leer un trozo…del fichero en el servidor. Comentando lo que está en negrita, consigo que no de error en el servidor. Pero si me lo da en el cliente (en negrita ) al intentar crear el fichero… Me estoy deserperando. Por favor si no os importa echarle un vistazo al enjendro que he hecho y orientarme un poco. Gracias Función que manda ficheros al cliente: Código:
procedure TForm1.ActualizarCliente(nombreFichero:string); var stream: TStream; leidos: Cardinal; trama:TMemoryStream; buf:pchar; nombFich:string; buffer:array[0..256] of byte; msjFICH:String; msjTRAMA:String; i:integer; PCliente:TPuntero; numFragm:integer; tam:integer; tipo: char; begin stream:=TFileStream.Create('Maestro\'+ nombreFichero,fmOpenRead); tam :=(stream.Size); leidos:=stream.Read(buffer,SizeOf(buffer)); ShowMessage('Pasa por las asig'); tipo:='f'; for i:=0 to MiLista.Count-1 do{Se recorren los clientes almacenados en la lista} begin ShowMessage('Pasa por el for'); PCliente:=MiLista.Items[i]; msjFICH:=tipo+ formatFloat('0000',tam)+ formatFloat('00',length(nombreFichero))+ nombreFichero; PCliente^.Conexion.SendText(formatFloat('000',length(msjFICH)+3)+msjFICH); end; tipo:='t'; repeat Application.ProcessMessages; trama:=TMemoryStream.Create; trama.WriteBuffer(buffer,leidos); ShowMessage('Pasa por el repeat'); for i:=0 to MiLista.Count-1 do{Se recorren los clientes almacenados en la lista} begin PCliente:=MiLista.Items[i]; msjTRAMA:=(tipo+ formatFloat('000',numFragm)+formatFloat('000',leidos)); PCliente^.Conexion.SendText(formatFloat('000',length(msjTRAMA)+3)+msjTRAMA); ShowMessage('Pasa por el sendtext'); PCliente^.Conexion.SendStream(trama); ShowMessage('Pasa por el sendstream'); end; leidos:=stream.Read(buffer,SizeOf(buffer));//me da error ShowMessage('Pasa por leidos'); trama.Position:=0; trama.Free; until(leidos=0); stream.Position:=0; stream.Free; end; Cliente que recibe los ficheros del servidor procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var //longCab:integer; MsjLocal:String; tipo:char; NombFich:String; tamMsj:integer; tamFich:integer; tamNombreFich:integer; numFrag:integer; FragLeidos:integer; TamEntrante:Integer; TamRecibido:Integer; buffer:array[0..9999] of byte; FicheroStream: TFileStream; begin ColaMsj:=ColaMsj+Socket.ReceiveText; while (length(ColaMsj)>=7) do//Para cojer tamaño mensaje y tipo begin memo1.Lines.Add('cola '+ColaMsj); tamMsj:=StrToInt(copy(ColaMsj,1,3)); memo1.Lines.Add('tam: '+IntToStr(tamMsj)); tipo:=ColaMsj[4]; memo1.Lines.Add('tipo'+tipo); if (length(ColaMsj)>=tamMsj) then begin if tipo = 'f' then begin tamFich:=StrToInt(Copy(ColaMsj,5,4)); memo1.Lines.Add('tamfich: '+IntToStr(tamFich)); tamNombreFich:=StrToInt(Copy(ColaMsj,9,2)); memo1.Lines.Add('tamnombrefich: '+IntToStr(tamNombreFich)); NombFich:=Copy(ColaMsj,11,tamNombreFich); memo1.Lines.Add('Nombrefich: '+NombFich ); msjLocal:=Copy(ColaMsj,1,tamMsj); // Cogemos el primer mensaje de la cola de mensajes delete(ColaMsj,1,tamMsj); // quitamos el primer mensaje de la cola end else//Mensaje de trama begin numFrag:=StrToInt(Copy(ColaMsj,5,3)); FragLeidos:=StrToInt(Copy(ColaMsj,8,3)); msjLocal:=Copy(ColaMsj,1,tamMsj); // Cogemos el primer mensaje de la cola de mensajes delete(ColaMsj,1,tamMsj); // quitamos el primer mensaje de la cola end; end; Sleep(1); FicheroStream := TFileStream.Create(NombFich, fmCREATE or fmOPENWRITE and fmsharedenywrite); TamEntrante:= Socket.ReceiveLength; while TamEntrante > 0 do begin TamRecibido:=Socket.ReceiveBuf(buffer,Sizeof(buffer)); if TamRecibido > 0 then begin FicheroStream.Write(buffer,tamRecibido); end; end; end; end; |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Protocolo PPI | SoulSoldier | C++ Builder | 2 | 23-07-2013 10:39:49 |
Envio de Mensajes entre aplicaciones | edgusano | API de Windows | 6 | 21-12-2005 07:25:11 |
Protocolo jabber. | Tony_G | Internet | 2 | 04-06-2005 13:14:58 |
Protocolo frontpage | jam | Internet | 4 | 05-11-2003 20:33:44 |
Envio de archivos entre aplicaciones | Mauricio Correa | Varios | 0 | 03-10-2003 07:29:57 |
|