sock_t sock_connect_wto(const char *hostname, const int port, const int timeout) { int sock; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) return -1; if (timeout) { sock_set_blocking (sock, SOCK_NONBLOCK); if (sock_try_connection (sock, hostname, port) < 0) { int ret = sock_connected (sock, timeout); if (ret <= 0) { sock_close (sock); return SOCK_ERROR; } } sock_set_blocking(sock, SOCK_BLOCK); } else { if (sock_try_connection (sock, hostname, port) < 0) { sock_close (sock); sock = SOCK_ERROR; } } return sock; }
sock_t sock_connect_wto_bind (const char *hostname, int port, const char *bnd, int timeout) { sock_t sock; sock = sock_open (AF_INET, SOCK_STREAM, 0); if (sock == SOCK_ERROR) return SOCK_ERROR; if (bnd) { struct sockaddr_in sa; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; if (inet_aton (bnd, &sa.sin_addr) == 0 || bind (sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) { sock_close (sock); return SOCK_ERROR; } } if (timeout) { sock_set_blocking (sock, 0); if (sock_try_connection (sock, hostname, port) < 0) { int ret = sock_connected (sock, timeout); if (ret <= 0) { sock_close (sock); return SOCK_ERROR; } } sock_set_blocking(sock, 1); } else { if (sock_try_connection (sock, hostname, port) < 0) { sock_close (sock); sock = SOCK_ERROR; } } return sock; }
int sock_connect_non_blocking (const char *hostname, const unsigned port) { int sock; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) return -1; sock_set_blocking (sock, SOCK_NONBLOCK); sock_try_connection (sock, hostname, port); return sock; }
sock_t sock_connect_non_blocking (const char *hostname, unsigned port) { sock_t sock; sock = sock_open (AF_INET, SOCK_STREAM, 0); if (sock == SOCK_ERROR) return SOCK_ERROR; sock_set_blocking (sock, 0); sock_try_connection (sock, hostname, port); return sock; }