| 123456789101112131415161718192021222324252627282930313233343536373839 |
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <unistd.h>
- #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;
- }
|