int rpc_connect_async(struct rpc_context *rpc, const char *server, int port, rpc_cb cb, void *private_data) { struct addrinfo *ai = NULL; assert(rpc->magic == RPC_CONTEXT_MAGIC); if (rpc->fd != -1) { rpc_set_error(rpc, "Trying to connect while already connected"); return -1; } if (rpc->is_udp != 0) { rpc_set_error(rpc, "Trying to connect on UDP socket"); return -1; } rpc->auto_reconnect = 0; if (getaddrinfo(server, NULL, NULL, &ai) != 0) { rpc_set_error(rpc, "Invalid address:%s. " "Can not resolv into IPv4/v6 structure.", server); return -1; } switch (ai->ai_family) { case AF_INET: ((struct sockaddr_in *)&rpc->s)->sin_family = ai->ai_family; ((struct sockaddr_in *)&rpc->s)->sin_port = htons(port); ((struct sockaddr_in *)&rpc->s)->sin_addr = ((struct sockaddr_in *)(ai->ai_addr))->sin_addr; #ifdef HAVE_SOCKADDR_LEN ((struct sockaddr_in *)&rpc->s)->sin_len = sizeof(struct sockaddr_in); #endif break; case AF_INET6: ((struct sockaddr_in6 *)&rpc->s)->sin6_family = ai->ai_family; ((struct sockaddr_in6 *)&rpc->s)->sin6_port = htons(port); ((struct sockaddr_in6 *)&rpc->s)->sin6_addr = ((struct sockaddr_in6 *)(ai->ai_addr))->sin6_addr; #ifdef HAVE_SOCKADDR_LEN ((struct sockaddr_in6 *)&rpc->s)->sin6_len = sizeof(struct sockaddr_in6); #endif break; } rpc->connect_cb = cb; rpc->connect_data = private_data; freeaddrinfo(ai); if (rpc_connect_sockaddr_async(rpc, &rpc->s) != 0) { return -1; } return 0; }
int rpc_connect_async(struct rpc_context *rpc, const char *server, int port, rpc_cb cb, void *private_data) { struct sockaddr_in *sin = (struct sockaddr_in *)&rpc->s; assert(rpc->magic == RPC_CONTEXT_MAGIC); if (rpc->fd != -1) { rpc_set_error(rpc, "Trying to connect while already connected"); return -1; } if (rpc->is_udp != 0) { rpc_set_error(rpc, "Trying to connect on UDP socket"); return -1; } rpc->auto_reconnect = 0; sin->sin_family = AF_INET; sin->sin_port = htons(port); if (inet_pton(AF_INET, server, &sin->sin_addr) != 1) { rpc_set_error(rpc, "Not a valid server ip address"); return -1; } switch (rpc->s.ss_family) { case AF_INET: #ifdef HAVE_SOCKADDR_LEN sin->sin_len = sizeof(struct sockaddr_in); #endif break; } rpc->connect_cb = cb; rpc->connect_data = private_data; if (rpc_connect_sockaddr_async(rpc, &rpc->s) != 0) { return -1; } return 0; }