GARANTIR DESCONTO

Fórum Problemão com Socket: Assíncrono #285161

17/06/2005

0

Pessoal, me ajudem por favor! Não sei mais o que pensar a respeito de tanto que já apanhei.
Tenho duas aplicações com socket, Cliente/Servidor, em que estou tendo muitas dificuldades e não consigo descobrir onde estou errando.

A primeira vez eu conecto, envio uma mensagem do Cliente para o Servidor e desconecto, parece ficar tudo certo. Já na segunda vez seguida aparece o erro: Asynchronous socket error 10038. Se eu parar a execução do programa cliente logo em seguida a este erro, aparece o seguinte: Asynchronous socket error 10053.

Os erros são básicamente:
Asynchronous socket error 10053
ou
Asynchronous socket error 10061
ou
Asynchronous socket error

Para enviar as mensagens estou fazendo o seguinte no cliente:
begin
   csEnviar.Address := IP_Estacao;
   repeat
      csEnviar.Active := True;
      Application.ProcessMessages;
   until (csEnviar.Active) or (TimeOut);

   if csEnviar.Active then begin
      csEnviar.Socket.SendText(Frame);

   csEnviar.Active := False;
end;

Onde: csEnviar = ClientSocket
TimeOut = Variável booleana de segurança

Para receber o texto no servidor eu faço o seguite no evento OnClientRead:
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
    msg_client:string;
begin
   msg_client := socket.ReceiveText;
   memo.Lines.Append(msg_client);
end;

Onde: ´ss´ = ServerSocket

Alguém pode me orientar sobre o que devo fazer? O objetivo dessas duas aplicações é basicamente abrir uma conexão do cliente com o servidor, enviar um texto e em seguida fechar a conexão entre cliente e servidor.

Valeu!
wbb


Wbb

Wbb

Responder

Posts

18/06/2005

Kapak

Olá colega, bom quando vc faz:
csEnviar.Address := IP_Estacao; 
   repeat 
      csEnviar.Active := True; 
      Application.ProcessMessages; 
   until (csEnviar.Active) or (TimeOut);
Vc repete [b:aea7059da6]csEnviar.Active := true;[/b:aea7059da6] e com isto ele entra num looping de erros até que a conexão seja feita ou timeout.
Ative a propriedade somente uma vez e depois entre no looping:
   csEnviar.Address := IP_Estacao;
   csEnviar.Active := True;
   While not csEnviar.Active and not timeout do
   begin
     Sleep(1); // evita a CPU ficar em 100¬
     Application.ProcessMessages;
   end;

A segunda parte é o lançamento das exceções 100xx que vc pode tratar e evitar nos eventos onError do TClientSocket e onClientError do TServerSocket. Note que nos dois eventos existe a variável ErrorCode que é colocada como referência; para que o sistema não lance a exceção, deixe: [b:aea7059da6]ErrorCode := 0;[/b:aea7059da6]

Bom, espero que solucione seu problema.
Abraços !!!


Responder

Gostei + 0

18/06/2005

Wbb

Fala aí kapak!

Olhe... você não tem idéia do quanto me ajudou. Putz... Show!!
Foram resolvidos os problemas fazendo exatamente como você indicou.

Muito obrigado pelas dicas.
wbb


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar