|
|
|
@ -258,16 +258,23 @@ struct stcp_client *stcp_client_connect(struct UASYNC *ua, const char *addr, uin |
|
|
|
c->on_close = close_cb; c->close_arg = close_arg; |
|
|
|
c->on_close = close_cb; c->close_arg = close_arg; |
|
|
|
c->tx_cb = client_tx_queue_cb; |
|
|
|
c->tx_cb = client_tx_queue_cb; |
|
|
|
|
|
|
|
|
|
|
|
c->sock = socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
struct addrinfo hints = {0}; |
|
|
|
if (c->sock == SOCKET_INVALID) { u_free(cli); return NULL; } |
|
|
|
hints.ai_family = AF_UNSPEC; |
|
|
|
|
|
|
|
hints.ai_socktype = SOCK_STREAM; |
|
|
|
|
|
|
|
char port_str[16]; snprintf(port_str, sizeof(port_str), "%u", port); |
|
|
|
|
|
|
|
struct addrinfo *res; |
|
|
|
|
|
|
|
if (getaddrinfo(addr, port_str, &hints, &res) != 0) { |
|
|
|
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "stcp_client getaddrinfo %s:%u failed", addr, port); |
|
|
|
|
|
|
|
u_free(cli); return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
c->sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
|
|
|
|
|
|
|
if (c->sock == SOCKET_INVALID) { freeaddrinfo(res); u_free(cli); return NULL; } |
|
|
|
socket_set_nonblocking(c->sock); |
|
|
|
socket_set_nonblocking(c->sock); |
|
|
|
struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); |
|
|
|
if (connect(c->sock, res->ai_addr, res->ai_addrlen) < 0 && socket_get_error() != EINPROGRESS) { |
|
|
|
saddr.sin_family = AF_INET; saddr.sin_port = htons(port); |
|
|
|
|
|
|
|
if (inet_pton(AF_INET, addr, &saddr.sin_addr) != 1) { socket_close_wrapper(c->sock); u_free(cli); return NULL; } |
|
|
|
|
|
|
|
if (connect(c->sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0 && socket_get_error() != EINPROGRESS) { |
|
|
|
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "stcp_client connect to %s:%u failed err=%d", addr, port, socket_get_error()); |
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_SOCKET, "stcp_client connect to %s:%u failed err=%d", addr, port, socket_get_error()); |
|
|
|
socket_close_wrapper(c->sock); u_free(cli); return NULL; |
|
|
|
socket_close_wrapper(c->sock); freeaddrinfo(res); u_free(cli); return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
freeaddrinfo(res); |
|
|
|
c->socket_id = uasync_add_socket_t(ua, c->sock, NULL, client_connect_write_cb, NULL, cli); |
|
|
|
c->socket_id = uasync_add_socket_t(ua, c->sock, NULL, client_connect_write_cb, NULL, cli); |
|
|
|
if (!c->socket_id) { socket_close_wrapper(c->sock); u_free(cli); return NULL; } |
|
|
|
if (!c->socket_id) { socket_close_wrapper(c->sock); u_free(cli); return NULL; } |
|
|
|
return cli; |
|
|
|
return cli; |
|
|
|
|