• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mikas

AJUDA URGENTE

5 mensagens neste tópico

Hoje ao contrario do costume tenho uma duvida em vez de um post a explicar alguma coisa.

Estou a receber um ficheiro atraves de um socket e quero executar um procedimento depois de acabar de receber o ficheiro.

O problema e que nao sei quando acabo de receber o ficheiro em questao, visto que dependendo do tamanho ele ira executar o evento seguinte varias vezes.

este e o meu codigo para receber, mas o ficheiro e enviado em pacotes mais pequenos, por isso cada vez que chega um pacote, este codigo e executado, nao tendo eu forma de saber quando o ficheiro acaba de ser recebido...

procedure TCliente.cliente2Read(Sender: TObject; Socket: TCustomWinSocket);
var
  iLen: Integer;
  bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;  // o receivelength retorna o nr de bytes que vao ser recebidos, mas nao o total, apenas do pacote naquela altura
  GetMem(bfr, iLen);
  try
   Socket.ReceiveBuf(bfr^, iLen);
   id.Write(bfr^, iLen)
  finally
    FreeMem(bfr);
  end;
end;

Por favor quem puder ajude-me e urgente!!!! Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Como o protocolo TCP/IP é do tipo "Streaming", quer dizer que as dados vão chegando em pacotes por ordem, mas não sabemos quando terminam.

Logo sugiro que alteres um pouco o teu protocolo de transferência de ficheiros, e no inicio da transferência deves indicar qual o tamanho do ficheiro a transferir.

No servidor podes ter algo do genero:

write (TamanhoDoFicheiro)

write (Ficheiro)

Loop

Depois no Cliente, só tens que ler o tamanho e ir recebendo dados até o tamanho dos dados recebidos chegar ao fim.

read(TamanhoDoFicheiro)

read(Buffer)

write (Ficheiro)

Loop

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta com estas alterações:

procedure TCliente.cliente2Read(Sender: TObject; Socket: TCustomWinSocket);
var
  iLen, iReceived: Integer;
  bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(bfr, iLen);
  try
    iReceived := Socket.ReceiveBuf(bfr^, iLen);
    if iReceived <= 0 then 
    begin
      // Ficheiro completo
      // Por codigo aqui
    end
    else id.Write(bfr^, iLen)
  finally
    FreeMem(bfr);
  end;
end;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso ja tentei, visto que se o receivebuf retornar -1 quer dizer que nao recebe nada, mas ele so faz o read quando recebe alguma coisa, por isso quando ja nao ha nada ele ntb nao faz read, ja experimentei e nao da, mas obrigado pelo esforço na mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê o exemplo que envio em anexo.

Penso que é isso que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora