Ho un'app per iPad in cui sto creando e collegando un posix socket
. Le chiamate a connect(...)
non rispondono come previsto quando il dispositivo remoto rifiuta il tentativo di connessione.socket connect() restituisce 0 anche dopo reset peer
Un esempio semplificato di come sto creando e collegando il socket
:
struct sockaddr_in server;
server.sin_family = AF_INET;
int socket = socket(AF_INET, SOCK_STREAM, 0);
if(socket < 0)
{
NSLog(@"socket create failed: %s", strerror(errno));
}
else if(inet_aton(mAddress, &server.sin_addr))
{
server.sin_port = htons(mPortNumber);
if(connect(socket, (struct sockaddr *)&server, sizeof(server)) == -1)
{
NSLog(@"connect() failed: %s", strerror(errno));
}
else
{
NSLog(@"connect() succeeded");
}
}
In molti casi, l'esempio precedente funziona: ad esempio per un dispositivo remoto (di seguito denominato "il server") che accetta le connessioni, connect()
restituisce 0
come previsto. Per un indirizzo inesistente, i blocchi connect()
per un po 'restituiscono -1
e errno
è ETIMEDOUT
.
Dalla documentazione, se il server rifiuta il tentativo di connessione mi aspetterei connect()
di tornare -1
e per errno
essere ECONNREFUSED
o forse ECONNRESET
. Invece, connect()
restituisce 0
.
ho WireSharked la conversazione TCP più volte e posso confermare che sempre e solo si compone di due pacchetti:
client (iPad) -> Server:
SYN, ACK
Server -> Client (iPad) :
RST, ACK
Perché il collegamento di ritorno 0
?
Aggiornamento: connessione allo stesso server da un client diverso, ad es. Qt su Windows (winsock?) O Mac OSX (anche posix) funziona come previsto: il connect()
restituisce -1
, ECONNREFUSED
. Questo mi porta a credere che si tratti di un problema con l'estremità dell'iPad piuttosto che con il server.
"* ... se il dispositivo remoto rifiuta il tentativo di connessione ... *" Sono non sono sicuro se 'to reject' sia un ben definito interms di azione della configurazione della connessione tcp/ip, quindi potresti voler approfondire la tua definizione. – alk
Quello che intendo per "connessione rifiutata" è uno con una conversazione TCP come quella precedente, cioè il client prova a "SYN" e il server risponde con un 'RST'. Quale terminologia useresti per descrivere questo? – sjwarner
Nessun 'SYN-ACK' dal telecomando in risposta al SYN dell'iPad? – alk