How do I output my host’s IP addresses from a C pr

2019-01-12 05:50发布

I need to display all the IP addresses from my local computer, using the C language. How can this be done?

标签: c linux sockets ip
8条回答
萌系小妹纸
2楼-- · 2019-01-12 06:22
#include <stdio.h>
#include <stropts.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/netdevice.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

int print_addresses(const int domain)
{
  int s;
  struct ifconf ifconf;
  struct ifreq ifr[50];
  int ifs;
  int i;

  s = socket(domain, SOCK_STREAM, 0);
  if (s < 0) {
    perror("socket");
    return 0;
  }

  ifconf.ifc_buf = (char *) ifr;
  ifconf.ifc_len = sizeof ifr;

  if (ioctl(s, SIOCGIFCONF, &ifconf) == -1) {
    perror("ioctl");
    return 0;
  }

  ifs = ifconf.ifc_len / sizeof(ifr[0]);
  printf("interfaces = %d:\n", ifs);
  for (i = 0; i < ifs; i++) {
    char ip[INET_ADDRSTRLEN];
    struct sockaddr_in *s_in = (struct sockaddr_in *) &ifr[i].ifr_addr;

    if (!inet_ntop(domain, &s_in->sin_addr, ip, sizeof(ip))) {
      perror("inet_ntop");
      return 0;
    }

    printf("%s - %s\n", ifr[i].ifr_name, ip);
  }

  close(s);

  return 1;
}

int main(int argc, char *argv[])
{
  int domains[] = { AF_INET, AF_INET6 };
  int i;

  for (i = 0; i < sizeof(domains) / sizeof(domains[0]); i++)
    if (!print_addresses(domains[i]))
      return 1;

  return 0;
}
查看更多
一夜七次
3楼-- · 2019-01-12 06:23

Your question might be imprecise but I am not sure why everyone is breaking your chops.

I think you are asking the basics in which case you probably want is getifaddrs. The man page has a little example program.

You can also get similar info using the SIOCGIFCONF option with ioctl(). There is some sample code on here and the web.

If you search around for these and similar terms you will find this question has been asked in various forms before. You have to dig around a bit.

Also note, these will not give you the public facing IP of your network if you are behind NAT.

查看更多
登录 后发表回答