studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones c sockets network-programming

c - reales - libro de android studio en español pdf



Error de operación ahora en progreso en el error de conexión(función) (1)

Quiero establecer el valor de tiempo de espera de la función de conexión pero me sale este error: "Operación ahora en progreso"

Mi código:

if ((he = gethostbyname(authdefhost)) == NULL) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot resolve %s: %s/n", authdefhost, hstrerror(h_errno)); return -1; } sin.sin_family = AF_INET; memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr)); if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot create client socket: %s/n", strerror(errno)); return -1; } if ((fcntl(sd, F_SETFL, O_NONBLOCK) < 0)) printf("error on setting socket flags."); if (connect(sd, (void *) & sin, sizeof(sin)) == -1) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot connect to server %s: %s/n", authdefhost, strerror(errno)); close(sd); return -1; } FD_ZERO(&fdset); FD_SET(sd, &fdset); int rv; if ((rv = select(sd + 1, NULL, &fdset, NULL, &tv)) == -1) { printf("error occurred on select function."); return -1; } else if (rv == 0) { printf("time out occurred."); return -1; } else { printf("connection established"); return sd; }


Cuando llame a connect() en un socket que no sea de bloqueo, obtendrá EINPROGRESS lugar de bloquear esperando a que se complete el EINPROGRESS de la conexión. Luego, debe select() para poder escribir y verificar el error de socket para ver si la conexión se ha completado.

Desde la página de manual de connect() Linux:

EINPROGRESS The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).