Ir para conteúdo
Fórum Script Brasil

Dolfin

Membros
  • Total de itens

    10
  • Registro em

  • Última visita

Posts postados por Dolfin

  1. O que tá rolando aqui é:

    eu tenho um componente OpenTextDialog que abre o TXT com endereços IP dos servidores para conexão... Cada thread cria um socket, cada socket conecta em um IP... Isso tá funcionando, porém, a conexão fica aberta e se eu preciso fechar e abri-la novamente, o programa por algum motivo já perdeu a propriedade Host, e tenta abrir a conexão com último host setado(última linha lida do TXT de IPs)...

    Vou colar o trecho que abre o TXT utilizando o OpenDialog:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenTextFileDialog1.InitialDir:= ExtractFilePath(Application.ExeName);
     if (OpenTextFileDialog1.Execute) then
      begin
        AssignFile(HostsFile, OpenTextFileDialog1.FileName);
        Reset(HostsFile);
    Esse código acima le o arquivo TXT e grava na variável HostsFile, aí eu chamo um procedure da Thread chamada ThreadsController, que controla o número de threads abertas pelo valor de um Edit ou pelo número de linhas do TXT, como segue abaixo:
    procedure Threads.ThreadsController;
    begin
     while ((StrToInt(Form1.Edit2.Text) > iThread) and (not eof(HostsFile))) do
      begin
       inc(iThread);
       Readln(HostsFile, HLine);
       Process:=Threads.Create(True);
       Sleep(10);
       UserController;
      end;
    end;
    Como pode ver, eu crio a Thread nessa procedure, e logo após a criação, ela é executada como segue a procedure:
    procedure Threads.Execute;
    begin
      Application.ProcessMessages;
      ClientSocket:= TClientSocket.Create(Application);
      ClientSocket.Port:= 81;
      ClientSocket.OnConnect:= OnConnect;
      ClientSocket.OnRead:= OnRead;
      ClientSocket.OnDisconnect:= OnDisconnect;
      ClientSocket.Host:= HLine;
    end;
    Bom, eu passo pela criação da Thread com sucesso para cada linha do TXT, ele abre cada thread para uma linha, cada socket com seu respectivo Host... O único problema é quando eu preciso fechar a conexão de alguma thread e re-abrir, porque aí a propriedade Host do ClientSocket já virou o último IP lido da lista... As threads não estão guardando essa propriedade do ClientSocket. A cada passada na Thread.Execute, as propriedades viram 'absolutas' e todos os ClientSockets de outras threads inclusive, ficam com a mesma propriedade parece... Lembrando que ClientSocket é uma variável privada da própria Thread, como mostro abaixo:
    Threads= class(TThread)
    private
      ClientSocket: TClientSocket;
      procedure ThreadsController;
      procedure UserController;
    .....

  2. Pessoal, é o seguinte... Eu estou trabalhando com o componente ClientSocket e Threads, e para cada thread, eu crio uma nova instância de um Socket com o seguinte código:

    procedure Threads.Execute;
    begin
      Application.ProcessMessages;
      ClientSocket:= TClientSocket.Create(Application); //criando o socket
      ClientSocket.Port:= 81; //setando a porta para conexao
      ClientSocket.OnConnect:= OnConnect; //setando evento onconnect
      ClientSocket.OnRead:= OnRead; //setando evento onread
      ClientSocket.OnDisconnect:= OnDisconnect; //setando evento ondisconnect
      ClientSocket.Host:= HLine; //lendo o host de um TXT
    end;

    Aonde:

    ClientSocket é uma variável privada da thread

    HLine aonde eu seto o Host, é uma variável que eu pego de uma linha de um TXT com servidores para conexão.

    O problema é:

    Com esse código eu achei que criava 1 socket por thread, e setava o Host do Socket para a linha atual que estaria lendo o TXT, e isso até funciona em partes... Ele abre as conexões com cada linha lida do TXT, porém num determinado momento, eu preciso fechar a conexão... E abri-la novamente mais tarde, e aí eu notei o seguinte:

    A propriedade Host do ClientSocket está sempre ficando com apenas 1 servidor... Ele não tá gravando cada ClientSocket de cada Thread com um Host, ele pega sempre o último o Host e seta como se fosse para todos... Como eu posso fazer para que cada thread tenha seu socket e cada socket tenha seu Host, para que eu possa abrir, fechar, re-abrir conexões, cada socket com seu host?

  3. Galera, eu sou novo no Delphi como podem perceber hehe... Eu tentei fazer uma procedure aqui, mas ela só é executada quando tem um ShowMessage dentro dela!!

    Ela tá declarada assim:

    procedure SocketsConnect(Sender: TClientSocket);

    Aí logo abaixo eu chamo ela assim:

    SocketsConnect(Sockets);

    E ela tá assim:

    procedure TForm1.SocketsConnect(Sender: TClientSocket);
    begin
        BannerControl:=0;
        UserAuthControl:=0;
        PassAuthControl:=0;
        //ShowMessage('To ae');
          if Sockets[i].Socket.ReceiveLength > 0 then
      begin
        Texto:= Sockets[i].Socket.ReceiveText;
        if (BannerControl = 0) and (UserAuthControl = 0) and (PassAuthControl = 0) then
         begin
           inc(BannerControl);
           Memo1.Lines.Append(Texto);
           Texto:='';
         end;
    end;

    Como podem ver tem até um ShowMessage comentado ali nela, que se eu deixo assim, nada dessa procedure é executado, mas se habilito o showmessage e clico em OK, executa a procedure toda certinha! Que isso???

  4. Primeiramente, boa tarde!

    Estou 'rascunhando' um cliente POP3 aqui no Delphi e para aprendizado to tentando fazer tudo via API do WinSock nativo do Windows.

    Mas sou iniciante em programação e no Delphi, uma vez ou outra pego para fazer algum programinha, mais por aprendizado mesmo...

    E me surgiu um problema que creio que para a maioria de vocês vai ser um problema bem bobo, mas já procurei e não consigo encontrar como solucionar...

    É o seguinte, eu conecto pela porta 110 do servidor POP3, e logo de cara ele me exibe a mensagem:

    +OK Hello there. <32394.1323537196@localhost.localdomain>

    Porém eu não consigo puxar essa mensagem pelo meu programa, gostaria de exibir isso num Memo, porém só aparecem caracteres orientais e quadrados... Abaixo vou colar a parte do código:

    if(connect(sock,addr,sizeof(addr)) = -1) then
    begin
    writeln('Ocorreu um erro ao conectar-se.');
    exit;
    end;
    ZeroMemory(@buf,100);
    recv(sock,buf,sizeof(buf),0);
    Memo1.Lines.Add(StrPas(buf));
    end;

    Essa parte conecta, recebe o texto, grava na variavel buf e adiciona o conteúdo da buf na Memo1... Como disse, só aparecem caracteres esquisitos...

    Aguardo a ajuda de vocês!!!

  5. Uhmm... Ok, mas o problema na verdade está na hora da Query... No FormCreate eu dou a seguinte query:

    ADOQuery1.SQL.Add('select Nome, CPF, Endereço from Clientes');

    Assim ele preenche a DBGrid, aí na hora de salvar os dados eu to fazendo assim:

    ADOQuery1.SQL.Add('insert into Clientes(Endereço) VALUES (:a)');

    ADOQuery1.Parameters.ParamByName('a').Value:= DBEdit1.Text;

    Só que pra isso eu preciso dar um .clear, pra fazer a nova query... Como que eu vou ficar trabalhando com novas queries e deixando as antigas lá??

    você não precisa fazer isso basta usar o select, e usar o adoquery1.post pra salvar o registro,

    o insert vai inserir um novo registro e pelo que eu entendi você quer alterar um registro que ta na tela.

    Tem como exemplificar?

    ATENÇÃO: Atente para as Regras do Forum

    3.8 Não é permitida a postagem de mensagens com a finalidade de manter o tópico no início da lista (up), nem de mensagens que não se refiram ao assunto do tópico (flood). Caso isso ocorra, as mensagens serão excluídas e os autores, advertidos.

  6. Uhmm... Ok, mas o problema na verdade está na hora da Query... No FormCreate eu dou a seguinte query:

    ADOQuery1.SQL.Add('select Nome, CPF, Endereço from Clientes');

    Assim ele preenche a DBGrid, aí na hora de salvar os dados eu to fazendo assim:

    ADOQuery1.SQL.Add('insert into Clientes(Endereço) VALUES (:a)');

    ADOQuery1.Parameters.ParamByName('a').Value:= DBEdit1.Text;

    Só que pra isso eu preciso dar um .clear, pra fazer a nova query... Como que eu vou ficar trabalhando com novas queries e deixando as antigas lá??

  7. Estou editando o post, pois minha dúvida não foi esclarecida, então vou escrever de forma mais compacta e objetiva!


    É o seguinte: tenho um DBGrid, que exibe os dados de uma tabela clientes, através do ADOQUERY(select Nome, CPF, Endereço from Clientes)...
    Eu gostaria de fazer alterações manualmente no banco de dados, através de DBEdits, então carrego os dados do cliente selecionado na DBGrid em DBEdits, e tenho um botão de salvar que executa a seguinte QUERY(insert into Clientes(Nome) values (:a)) e logo abaixo:
    ADOQuery1.Parameters.ParamByName('a').Value:= DBEdit1.Text;

    Supostamente isso deveria pegar o valor do DBEdit1 e adicionar na tabela certo? Errado, pois quando faço a nova query insert no ADOQuery, ele limpa e some com todos os registros, inclusive do DBGrid e do DBEdit (que está tudo conectado) e acaba inserindo uma linha vazia na tabela, uma vez que perdeu todos os dados no momento da nova query...
    Como realizar isso? Como salvar os dados da primeira query no DBGrid para realizar a segunda query sem que eu perca tudo?

    Coisas tentadas
    Usar o comando ADOQuery1.Post depois da primeira query, achando que ia salvar, mas não salvou nada, quando dou a segunda query, some tudo do mesmo jeito...

    Coisa pensadas
    Depois de preencher o DBGrid com os dados na primeira query, 'deslinkar' ele do DataSource, para que não passe mais queries por ele, mas acho que isso ficaria uma porcaria :blink: ...

    SALVE-ME QUEM PUDER!!
  8. Po tá difícil... Eu só consegui descobrir que a imagem só tá vindo um pedaço, não sei porque, já coloquei um while pra ficar lendo a imagem até o tamanho enviado pelo stream seja o mesmo do recebido, mas não adiantou... Engraçado que o código é simples e funciona quando não tem aquele 'if', como já disse no post...Infelizmente acho que o pessoal aqui não sabe qual a conclusão...

    Agradeço mesmo assim.

  9. Sim foi uma ótima dica, se eu não quisesse desenvolver o meu. Existem centenas de programas de assistência remota por aí, mas eu estou fazendo um que atende a necessidades particulares do meu ambiente de trabalho. E além disso tem a questão do aprendizado, não é porque existem programas prontos que eu vou desistir de fazer um meu. Ainda não consegui fazer funcionar, se alguém souber... A dúvida continua...

  10. Bom, primeiramente quero dizer que apesar desse ser meu primeiro post no fórum, já tirei muitas dúvidas aqui, e espero que possam me ajudar com essa. Estou fazendo um programa de Assistência Remota, com o envio da screenshot do ServerSocket através de stream. Já estou conseguindo emular os clicks do mouse e até teclas apertadas, apesar da função não estar muito boa, porém o problema não é esse. O lance é o seguinte, o meu código para envio do stream atual está assim no servidor:

    Comando:=Socket.ReceiveText;

    if Comando='screen' then

    begin

    {Aqui começa a função de Bitblt para pegar a imagem,etc...Não interessa pra nós }

    jpg.SaveToStream(Stream);

    Stream.Position:=0;

    Socket.SendText('Screen:' + inttostr(Stream.Size) + #0); //Envio depois do Stream.Size o #0 para delimitar o Size sem misturar com o inicio da imagem

    Socket.SendStream(Stream);

    -----

    Aí surgiu o problema, se no Socket.SendText eu ponho apenas Socket.SendText(inttostr(Stream.Size) + #0); sem o 'Screen:' funciona perfeitamente, porém aí no clientread lá no Cliente, eu não posso usar um if Comando='Screen:' ... E eu preciso disso, prq eu vou receber mais de 1 coisa no clientread e sem isso, é como se todo evento do read fosse uma screen...Abaixo segue o código do cliente para vocês visualizarem melhor:

    if LeftStr(Chegando,7) = 'Screen:' then

    begin

    Delete(Chegando, 1, 7); //Deleto o 'Screen:' da var Chegando, pois ele é só pra identificar que é uma screen, não faz parte da coisa toda...

    if not Receiving then //Se o BOOL Receiving ainda for falso(não estiver recebendo) eu pego o Stream.Size enviado e gravo na var stSize

    begin

    if pos(#0,Chegando) > 0 then //Se encontrar o delimitador #0 que enviei lá no server na var Chegando então...

    stSize:=strtoint(copy(Chegando,1,pos(#0,Chegando)-1))//O StSize é o que veio antes dele, ou seja o Stream.Size

    else

    exit;

    begin

    Stream:=TMemoryStream.Create;//Crio o Stream

    Receiving:=True;//Começo a receber

    Delete(Chegando,1,pos(#0,Chegando));//Deleto o que tem antes do #0 ou seja Stream.Size pois não faz parte da imagem

    end;

    end;

    try

    Stream.Write(Chegando[1],Length(Chegando));//Começo a escrever o stream recebido

    if Stream.Size = stSize then//Aqui me indica o problema,se nesse if eu ponho Stream.Size < stSize ele começa a exibir o inicio da img apenas,porém se fica = ou seja: quando o recebido e escrito, for igual ao stSize que é o Stream.Size enviado do servidor forem iguais,ou seja a img tiver sido recebida por completa...Eu ponho ela num componente Image1...Isso não interessa colar aki também...

    ---------------------

    Bom pessoal, esse código funciona, desde que no servidor tire do Socket.SendText o 'Screen:' e no ClientOnRead ponha apenas começando o if Not Receiving, sem aquele if Chegando = 'Screen:' ....

    Pelo que percebi é que o Stream.Size recebido pelo Cliente é sempre menor que o Stream.Size enviado...Parece que o Cliente não consegue receber a imagem toda,só o inicio...mas tenho certeza que o servidor envia a img toda...Prq já puis um ShowMessage lá, indicando o Stream.Size enviado e foi da img toda, porém o recebido pelo Cliente é um pedacinho só...Minimo... Espero que vocês possam me ajudar, tentei formatar o post o máximo possível para organizar as coisas, é bem complicado, mas leiam que vocês vão entender..

    Valeu!!

×
×
  • Criar Novo...