Domanda

Non ho ancora trovato nulla su come controllare se una porta è aperta o meno.Ho provato a realizzarlo con la classe AsyncSocket ma ritorna sempre TRUE anche se rifiuto tutte le connessioni a quella porta sul mio server. Inoltre, ho provato a utilizzare il metodo isConnected di AsyncSocket, ma restituisce sempre FALSE.

Il mio codice finora:

//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];
È stato utile?

Soluzione

Devi renderti il delegato e gestire il metodo onSocket: willDisconnectWithError:.La connessione è completamente asincrona, quindi a meno che non ci sia un problema di sistema fondamentale (i socket sono disabilitati, hai passato un indirizzo non valido, ecc.) Allora quella chiamata avrà sempre successo mentre il tentativo di connessione al socket avviene in background.

Se il tentativo fallisce, verrà chiamato il metodo onSocket: willDisconnectWithError: delegate in modo che tu possa sapere che il tentativo di connessione non è riuscito.

Non sono sicuro del perché, ma la classe AsyncSocket considera lo stato del flusso kCFStreamStatusError come "connesso", quindi sospetto che sia per questo che si presenta come connesso.Puoi seguire tutto questo nel sorgente di AsyncSocket.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top