TCPClientUtility.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <unistd.h>
  5. #include "Practical.h"
  6. int setup_tcp_client_socket(const char *host, const char *service) {
  7. struct addrinfo addr_criteria = {0};
  8. addr_criteria.ai_family = AF_UNSPEC;
  9. addr_criteria.ai_socktype = SOCK_STREAM;
  10. addr_criteria.ai_protocol = proto_get_num("tcp");
  11. struct addrinfo *serv_addr = nullptr;
  12. int ret = getaddrinfo(host, service, &addr_criteria, &serv_addr);
  13. if (ret != 0) {
  14. DieWithUserMessage("getaddrinfo() failed", gai_strerror(ret));
  15. }
  16. int sock = -1;
  17. for (struct addrinfo *addr = serv_addr; addr != nullptr; addr = addr->ai_next) {
  18. sock = socket(AF_to_PF(addr->ai_family), addr->ai_socktype, addr->ai_protocol);
  19. if (sock < 0) {
  20. continue;
  21. }
  22. ret = connect(sock, addr->ai_addr, addr->ai_addrlen);
  23. if (ret == 0) {
  24. break;
  25. } else {
  26. close(sock);
  27. sock = -1;
  28. }
  29. }
  30. freeaddrinfo(serv_addr);
  31. return sock;
  32. }