int swClient_tcp_connect(swClient *cli, char *host, int port, float timeout, int nonblock) { int ret; cli->serv_addr.sin_family = cli->sock_domain; cli->serv_addr.sin_port = htons(port); cli->serv_addr.sin_addr.s_addr = inet_addr(host); cli->timeout = timeout; swSetTimeout(cli->sock, timeout); if(nonblock == 1) { swSetNonBlock(cli->sock); } else { swSetBlock(cli->sock); } while (1) { ret = connect(cli->sock, (struct sockaddr *) (&cli->serv_addr), sizeof(cli->serv_addr)); if (ret < 0) { if (errno == EINTR) { continue; } } break; } return ret; }
static int swClient_tcp_connect_sync(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret; cli->timeout = timeout; if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } if (nonblock == 1) { swSetNonBlock(cli->socket->fd); } else { if (cli->timeout > 0) { swSocket_set_timeout(cli->socket->fd, timeout); } swSetBlock(cli->socket->fd); } while (1) { ret = connect(cli->socket->fd, (struct sockaddr *) &cli->server_addr.addr, cli->server_addr.len); if (ret < 0) { if (errno == EINTR) { continue; } } break; } if (ret >= 0) { cli->socket->active = 1; #ifdef SW_USE_OPENSSL if (cli->open_ssl) { if (swClient_enable_ssl_encrypt(cli) < 0) { return SW_ERR; } if (swClient_ssl_handshake(cli) < 0) { return SW_ERR; } } #endif } return ret; }
static int swClient_tcp_connect(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret; cli->timeout = timeout; if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } if (nonblock == 1) { swSetNonBlock(cli->connection.fd); } else { if (cli->timeout > 0) { swSetTimeout(cli->connection.fd, timeout); } swSetBlock(cli->connection.fd); } while (1) { ret = connect(cli->connection.fd, (struct sockaddr *) &cli->server_addr.addr, cli->server_addr.len); if (ret < 0) { if (errno == EINTR) { continue; } } break; } if (ret >= 0) { cli->connection.active = 1; } return ret; }
static int swClient_tcp_connect_sync(swClient *cli, char *host, int port, double timeout, int nonblock) { int ret, n; char buf[1024]; cli->timeout = timeout; if (swClient_inet_addr(cli, host, port) < 0) { return SW_ERR; } if (nonblock == 1) { swSetNonBlock(cli->socket->fd); } else { if (cli->timeout > 0) { swSocket_set_timeout(cli->socket->fd, timeout); } swSetBlock(cli->socket->fd); } while (1) { ret = connect(cli->socket->fd, (struct sockaddr *) &cli->server_addr.addr, cli->server_addr.len); if (ret < 0) { if (errno == EINTR) { continue; } } break; } if (ret >= 0) { cli->socket->active = 1; //socks5 proxy if (cli->socks5_proxy) { swSocks5_pack(buf, cli->socks5_proxy->username == NULL ? 0x00 : 0x02); if (cli->send(cli, buf, 3, 0) < 0) { return SW_ERR; } cli->socks5_proxy->state = SW_SOCKS5_STATE_HANDSHAKE; while (1) { n = cli->recv(cli, buf, sizeof(buf), 0); if (n > 0) { if (swSocks5_connect(cli, buf, n) < 0) { return SW_ERR; } else { if (cli->socks5_proxy->state == SW_SOCKS5_STATE_READY) { break; } else { continue; } } } return SW_ERR; } } #ifdef SW_USE_OPENSSL if (cli->open_ssl) { if (swClient_enable_ssl_encrypt(cli) < 0) { return SW_ERR; } if (swClient_ssl_handshake(cli) < 0) { return SW_ERR; } } #endif } return ret; }