test-net.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <ccan/net/net.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>
  5. #include <stdio.h>
  6. #include <err.h>
  7. static unsigned int count_addrs(const struct addrinfo *addr, int family)
  8. {
  9. unsigned int num = 0;
  10. while (addr) {
  11. if (family == AF_UNSPEC || family == addr->ai_family)
  12. num++;
  13. addr = addr->ai_next;
  14. }
  15. return num;
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19. struct addrinfo *addr;
  20. const char *dest, *port;
  21. int fd;
  22. struct sockaddr saddr;
  23. socklen_t slen = sizeof(saddr);
  24. if (argc == 2) {
  25. dest = argv[1];
  26. port = "http";
  27. } else if (argc == 3) {
  28. dest = argv[1];
  29. port = argv[2];
  30. } else
  31. errx(1, "Usage: test-net <target> [<port>]");
  32. addr = net_client_lookup(dest, port, AF_UNSPEC, SOCK_STREAM);
  33. if (!addr)
  34. err(1, "Failed to look up %s", dest);
  35. printf("Received %u IPv4 addresses, %u IPv6 addresses\n",
  36. count_addrs(addr, AF_INET), count_addrs(addr, AF_INET6));
  37. fd = net_connect(addr);
  38. if (fd < 0)
  39. err(1, "Failed to connect to %s", dest);
  40. if (getsockname(fd, &saddr, &slen) == 0)
  41. printf("Connected via %s\n",
  42. saddr.sa_family == AF_INET6 ? "IPv6"
  43. : saddr.sa_family == AF_INET ? "IPv4"
  44. : "UNKNOWN??");
  45. else
  46. err(1, "Failed to get socket type for connection");
  47. return 0;
  48. }