iOS SDK: Como posso verificar se a porta está aberta?
-
27-10-2019 - |
Pergunta
Eu não encontrei nada ainda sobre como verificar se uma porta está aberta ou não. Tentei perceber isso com a classe AsyncSocket mas ele retorna sempre verdade, embora eu rejeitar todas as conexões com essa porta no meu servidor.
Além disso, eu tentei usar o método isConnected
de AsyncSocket mas que sempre retorna FALSE.
O meu código até agora:
//Init socket
socket=[[AsyncSocket alloc] initWithDelegate:self];
//results on TRUE always!
NSLog(@"Ready");
NSError *err = nil;
if(![socket connectToHost:@"10.1.2.40" onPort:25 error:&err])
{
NSLog(@"Error: %@", err);
}
else
{
NSLog(@"Connected");
}
//addition - results in FALSE always!
if([socket isConnected])
{
NSLog(@"yes, its connected");
}
else
{
NSLog(@"not connected...");
}
[socket disconnect];
Solução
Você precisa fazer-se o delegado e lidar com a onSocket: willDisconnectWithError: método. A conexão é totalmente assíncrona de modo a menos que haja um problema no sistema fundamental (soquetes estão desativados, você passou em um endereço inválido, etc), então essa chamada sempre terá êxito enquanto a tentativa de conexão de soquete acontece em segundo plano.
Se essa tentativa falhar, o onSocket: willDisconnectWithError:. Método delegado será chamado para que você possa conhecer a tentativa de conexão falhou
Eu não sei por que, mas a classe AsyncSocket considera o status de fluxo de kCFStreamStatusError a ser "ligado", então eu suspeito que é por isso que ele aparece como conectado. Você pode acompanhar tudo isso na fonte de AsyncSocket.