Problemão com Socket: Assíncrono

Delphi

17/06/2005

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

Curtidas 0

Respostas

Kapak

Kapak

17/06/2005

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 !!!


GOSTEI 0
Wbb

Wbb

17/06/2005

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


GOSTEI 0
POSTAR