#include #include #include #include #include "Practical.h" int setup_tcp_client_socket(const char *host, const char *service) { struct addrinfo addr_criteria = {0}; addr_criteria.ai_family = AF_UNSPEC; addr_criteria.ai_socktype = SOCK_STREAM; addr_criteria.ai_protocol = proto_get_num("tcp"); struct addrinfo *serv_addr = nullptr; int ret = getaddrinfo(host, service, &addr_criteria, &serv_addr); if (ret != 0) { DieWithUserMessage("getaddrinfo() failed", gai_strerror(ret)); } int sock = -1; for (struct addrinfo *addr = serv_addr; addr != nullptr; addr = addr->ai_next) { sock = socket(AF_to_PF(addr->ai_family), addr->ai_socktype, addr->ai_protocol); if (sock < 0) { continue; } ret = connect(sock, addr->ai_addr, addr->ai_addrlen); if (ret == 0) { break; } else { close(sock); sock = -1; } } freeaddrinfo(serv_addr); return sock; }