Página 1 de 1

C++ Builder erro com Socket.

MensagemEnviado: 20 Mar 2009 08:25
por Junior_C
Olá, estou montando um sistema de coletores de dados por gprs onde ele fica conectado o tempo todo ao servidor pois o servidor envia comandos para os módulos e o modulo responde com os valores solicitados, está funcionando perfeitamente, mas quando desliga um dos coletores sem desconectar o gprs o soket não reconhece que a conecção caiu e quando o servidor envia um dado para esta conecção depois de um tempo aparece uma mensagem de erro "Assynchronous Socket error 10053" e trava.

Utilizei o C++ Builder6 e ServerSocket


Alguem tem alguma dica de como posso tratar este erro sem travar o servidor e sem aparecer esta mensagem na tela?

Qualquer ajuda será bem vinda, obrigado a todos.

MensagemEnviado: 20 Mar 2009 11:24
por Jorge_Francisco
O servidor tinha que ter um timeout ou algo assim.

MensagemEnviado: 20 Mar 2009 17:48
por Junior_C
Jorge, desculpe minha ignorancia, mas é que não entendo de servidor mesmo, não entendi como um timeout evitaria esse problema, pois o problema só ocorre quando o servidor tenta enviar um dado para uma coneção e ela não responde, o que preciso fazer é que caso não venha a resposta o programa não trave com a mensagem de erro, preciso eliminar esta mensagem e tratar o erro sem precisar clicar no ok da mensagem para o programa voltar a funcionar, mas não estou encontrando uma maneira de fazer isso.

Qualquer ajuda será bem vinda, obrigado.

MensagemEnviado: 20 Mar 2009 19:34
por joao
Ola Junior C,

Você poderia passar uma parte do programa para podermos dar uma analisada?

Pois tentei achar info na internet sobre o ServerSocket no C++ builder e não consegui achar quase nada...

[]'s

MensagemEnviado: 21 Mar 2009 19:41
por Jorge_Francisco
Bom, não estou com o builder aqui, mas pode tratar o erro e colocar a sua msg ou então aparecer msg alguma e logo depois fechar a conexão. Assim que achar o tratamento te passo.

Vlw

MensagemEnviado: 23 Mar 2009 07:32
por chipselect
Não dá pra usar exceções (Exceptions)?

Ficaria tudo dentro de um try...catch, acho que é a forma mais correta de tratar vários tipos de erros.

Só para teste usa "try {//código propício a erro}catch(...){//código de tratamento de erro}" pra ver se funciona da maneira que você quer, isso aí pega tudo que é exceção, mas não considero totalmente correto pegar todas as exceções em um único catch.

MensagemEnviado: 23 Mar 2009 07:38
por Junior_C
Olá, João, segue abaixo uma parte do código ele é executado quando uma conecção desconecta, ai envio um pedido de identificação para todas as conecções ativas para saber qual o número da coneção para cada dispositivo conectado, mas só funciona quando o dispositivo é desconectado, quando desliga sem desconectar e envio algo para a conecção acontece o erro e a mensagem aparece.


void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
int i;

if(Form1->ServerSocket1->Active == true){
for(i=0;i<Form1->ServerSocket1->Socket->ActiveConnections; i++ ){
ServerSocket1->Socket->Connections[i]->SendText("PP\r\n");
}
}

}

Qualquer ajuda será bem vinda, obrigado a todos.

MensagemEnviado: 23 Mar 2009 07:54
por Junior_C
Chipselect é isso que estou tentado fazer acho que é isso mesmo, mas estou aprendendo trabalhar com o Builder e não sei tratar excessões e não encontrei nenhum exemplo com sockets na net, se puder passar alguma dica ou algum link onde tenha informações.

Obrigado pela força.

MensagemEnviado: 23 Mar 2009 08:52
por joao
Ola Junior-C,

Foi difícil achar algo sobre isso heim!
Principalmente porque estava procurando apenas por ServerSocket e não socket. Depois que mudei, apareceu mais opções

Uma delas é:
http://en.allexperts.com/q/Delphi-1595/ ... ponent.htm
Está para delphi, mas deve ser quase identico.

Pelo o que eu entendi, você tem um método chamado open né? Este método retorna para você um ponteiro para uma classe.
Nesta classe você tem a opção de setar a variável OnClientError para NULL por exemplo.
Dai não receberá mais as mensagens de error...

Tente ai e nos de uma resposta...

[]'s

MensagemEnviado: 24 Mar 2009 08:06
por chipselect
tenta isso na sua rotina de "write":

[code]
try
{
//código de escrita no socket
}
catch (...)
{
//Rotina de tratamento de erro
}
[/code]

O código acima ("catch (...)") captura todas as exceções que ocorrerem, mas o ideal é você especificar a exceção correta que você quer tratar.

Obs.: Em modo DEBUG o cbuilder continua mostrando as janelas pop-up das exceções, mas o código que você colocar no "catch" irá ser executado normalmente. Em modo RELEASE essa janela geralmente é suprimida.[/code]

MensagemEnviado: 26 Mar 2009 07:27
por Junior_C
Obrigado a todos pela ajuda, resolvido com o código abaixo.


void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
int i;

ErrorCode = 0;
String RemoteHost = Socket->RemoteHost;

for(i=0; i<ServerSocket1->Socket->ActiveConnections;i++){
if(ServerSocket1->Socket->Connections[i]->RemoteHost==RemoteHost)break;
}
ServerSocket1->Socket->Connections[i]->Close();

}