int httpclient_conn(httpclient_t *client, char *host)
{
struct addrinfo hints, *addr_list, *cur;
struct timeval timeout;
int ret = 0;
char port[10] = {0};
struct sockaddr_in6 *sin;
memset( &hints, 0, sizeof( hints ) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
cm_printf("start conn\n");
timeout.tv_sec = client->timeout_in_sec > HTTPCLIENT_MAX_SOC_TIMEOUT ? HTTPCLIENT_MAX_SOC_TIMEOUT : client->timeout_in_sec;
timeout.tv_usec = 0;
snprintf(port, sizeof(port), "%d", client->remote_port) ;
if ( getaddrinfo( host, port , &hints, &addr_list ) != 0 ) {
DBG("getaddrinfo != 0, return HTTPCLIENT_UNRESOLVED_DNS");
cm_printf("unresolve dns\n");
return HTTPCLIENT_UNRESOLVED_DNS;
}
/* Try the sockaddrs until a connection succeeds */
ret = HTTPCLIENT_UNRESOLVED_DNS;
for ( cur = addr_list; cur != NULL; cur = cur->ai_next ) {
client->socket = (int) socket( cur->ai_family, cur->ai_socktype,
cur->ai_protocol );
if ( client->socket < 0 ) {
ret = HTTPCLIENT_ERROR_CONN;
continue;
}
/* set timeout if user need */
if ( client->timeout_in_sec > 0) {
lwip_setsockopt(client->socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
lwip_setsockopt(client->socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
}
if ( connect( client->socket, cur->ai_addr, (int)cur->ai_addrlen ) == 0 ) {
ret = 0;
sin = (struct sockaddr_in *)cur->ai_addr;
cm_printf("addr:%s\n",inet6_ntoa(sin->sin6_addr));
break;
}
close( client->socket );
ret = HTTPCLIENT_ERROR_CONN;
}
freeaddrinfo( addr_list );
return ret;
}