Página 1 de 1
C++ Builder erro com Socket.

Enviado:
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.

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

Enviado:
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.

Enviado:
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

Enviado:
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

Enviado:
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.

Enviado:
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.

Enviado:
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.

Enviado:
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

Enviado:
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]

Enviado:
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();
}