Linux C network programming and linux Network Programming
Obtain the local ip address, mac address, and the corresponding ip address through the domain name,
It is a common operation that may be encountered in network programming. Therefore, the summary is as follows (three functions are encapsulated ),
Go directlyCode:
# Include <stdio. h> # include <stdlib. h> # include <string. h> # include <errno. h> # include <unistd. h> # include <netdb. h> # include <net/if. h> # include <arpa/inet. h> # include <sys/ioctl. h> # include <sys/types. h> # include <sys/socket. h> # define MAC_SIZE18 # define IP_SIZE16 // function declareint get_ip_by_domain (const char * domain, char * ip); // obtain ipint get_local_mac (const char * eth_inf, char * mac); // obtain the macint of the Local Machine Get_local_ip (const char * eth_inf, char * ip ); // obtain the ip address of the Local Machine/******* main test *********/int main (void) {char ip [IP_SIZE]; char mac [MAC_SIZE]; const char * test_domain = "www.baidu.com"; const char * test_eth = "eth0"; get_ip_by_domain (test_domain, ip); printf ("% s ip: % s \ n ", test_domain, ip); get_local_mac (test_eth, mac); printf (" local % s mac: % s \ n ", test_eth, mac ); get_local_ip (test_eth, ip); printf ("local % s ip: % S \ n ", test_eth, ip); return 0 ;}// obtain ipint get_ip_by_domain (const char * domain, char * ip) {char ** pptr based on the domain name; struct hostent * hptr; hptr = gethostbyname (domain); if (NULL = hptr) {printf ("gethostbyname error for host: % s/n", domain ); return-1 ;}for (pptr = hptr-> h_addr_list; * pptr! = NULL; pptr ++) {if (NULL! = Inet_ntop (hptr-> h_addrtype, * pptr, ip, IP_SIZE) {return 0; // only obtain the first ip} return-1 ;} // obtain the macint get_local_mac (const char * eth_inf, char * mac) {struct ifreq ifr; int sd; bzero (& ifr, sizeof (struct ifreq )); if (sd = socket (AF_INET, SOCK_STREAM, 0) <0) {printf ("get % s mac address socket creat error \ n", eth_inf ); return-1;} strncpy (ifr. ifr_name, eth_inf, sizeof (ifr. ifr_name)-1); if (ioctl (sd, SIOCGIFHWADDR, & ifr) <0) {printf ("get % s mac address error \ n", eth_inf ); return-1;} snprintf (mac, MAC_SIZE, "% 02x: % 02x: % 02x: % 02x: % 02x: % 02x", (unsigned char) ifr. ifr_hwaddr.sa_data [0], (unsigned char) ifr. ifr_hwaddr.sa_data [1], (unsigned char) ifr. ifr_hwaddr.sa_data [2], (unsigned char) ifr. ifr_hwaddr.sa_data [3], (unsigned char) ifr. ifr_hwaddr.sa_data [4], (unsigned char) ifr. ifr_hwaddr.sa_data [5]); close (sd); return 0 ;}// obtain the local ipint get_local_ip (const char * eth_inf, char * ip) {int sd; struct sockaddr_in sin; struct ifreq ifr; sd = socket (AF_INET, SOCK_DGRAM, 0); if (-1 = sd) {printf ("socket error: % s \ n ", strerror (errno); return-1;} strncpy (ifr. ifr_name, eth_inf, IFNAMSIZ); ifr. ifr_name [IFNAMSIZ-1] = 0; // if error: No such deviceif (ioctl (sd, SIOCGIFADDR, & ifr) <0) {printf ("ioctl error: % s \ n ", strerror (errno); close (sd); return-1;} memcpy (& sin, & ifr. ifr_addr, sizeof (sin); snprintf (ip, IP_SIZE, "% s", inet_ntoa (sin. sin_addr); close (sd); return 0 ;}
Test RunThe result is as follows: