socket connect () devuelve 0 incluso después de reiniciarse por pares

Tengo una aplicación iPad en la que estoy creando y conectando un socket posix. Las llamadas para connect(...) no responden como se esperaba cuando el dispositivo remoto rechaza el bash de connection.

Un ejemplo simplificado de cómo estoy creando y conectando el 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"); } } 

En la mayoría de los casos, el ejemplo anterior funciona: por ejemplo, para un dispositivo remoto (en lo sucesivo denominado 'el server') que está aceptando conexiones, connect() devuelve 0 como se esperaba. Para una dirección inexistente, connect() bloques por un time y luego vuelve -1 , y errno es ETIMEDOUT .

De los documentos, si el server rechaza el bash de connection, esperaría que connect() devuelva -1 y que errno sea ECONNREFUSED o quizás ECONNRESET . En cambio, connect() devuelve 0 .

He WireSharked la conversación TCP varias veces y puedo confirmar que solo consta de dos packages:

Cliente (iPad) -> Servidor: SYN, ACK

Servidor -> Cliente (iPad): RST, ACK

¿Por qué conecta return 0 ?

Actualización: Conectarse al mismo server desde un cliente diferente, por ejemplo, Qt en Windows (winsock?) O Mac OSX (también posix) funciona como se espera: es decir, connect() devuelve -1 , ECONNREFUSED . Esto me lleva a creer que es un problema con el fin del iPad en lugar del final del server.

Creo que debería crear el socket de esta manera, tenga en count el tercer parámetro.

 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

Al final del día, realmente no importa que connect () devuelva 0 para la connection rechazada. Considere esto: Digamos que connect () tiene éxito, se establece la connection tcp y la llamada devuelve 0. Sin embargo, el server se reinicia o desconecta inmediatamente antes de que su código cambie para llamar o leer en el socket. La siguiente escritura falla con EPIPE y lee retornos 0. Debe manejar este caso de todos modos.

Supongo que ha leído esto, pero tenga en count que hay más advertencias al usar sockets POSIX en iOS: https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html