Linux C 网络编程

来源:互联网 发布:网络运营经理职责 编辑:程序博客网 时间:2024/05/22 03:21

struct ifreq{#define IFHWADDRLEN 6union{char ifrn_name[IFNAMSIZ];  } ifr_ifrn;union {struct sockaddr ifru_addr;struct sockaddr ifru_dstaddr;struct sockaddr ifru_broadaddr;struct sockaddr ifru_netmask;struct sockaddr ifru_hwaddr;short ifru_flags;int ifru_ivalue;int ifru_mtu;struct  ifmap ifru_map;char ifru_slave[IFNAMSIZ]; char ifru_newname[IFNAMSIZ];void __user * ifru_data;struct if_settings ifru_settings;} ifr_ifru;};#define ifr_name ifr_ifrn.ifrn_name #define ifr_hwaddr ifr_ifru.ifru_hwaddr #define ifr_addr ifr_ifru.ifru_addr #define ifr_dstaddr ifr_ifru.ifru_dstaddr #define ifr_broadaddr ifr_ifru.ifru_broadaddr #define ifr_netmask ifr_ifru.ifru_netmask #define ifr_flags ifr_ifru.ifru_flags #define ifr_metric ifr_ifru.ifru_ivalue #define ifr_mtu  ifr_ifru.ifru_mtu #define ifr_map  ifr_ifru.ifru_map #define ifr_slave ifr_ifru.ifru_slave #define ifr_data ifr_ifru.ifru_data #define ifr_ifindex ifr_ifru.ifru_ivalue #define ifr_bandwidth ifr_ifru.ifru_ivalue    #define ifr_qlen ifr_ifru.ifru_ivalue #define ifr_newname ifr_ifru.ifru_newname #define ifr_settings ifr_ifru.ifru_settings#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_SIZE    18  #define IP_SIZE     16    // function declare  int get_ip_by_domain(const char *domain, char *ip);// 根据域名获取ip  int get_local_mac(const char *eth_inf, char *mac);// 获取本机mac  int get_local_ip(const char *eth_inf, char *ip);// 获取本机ip      /****** 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;  }    // 根据域名获取ip  int get_ip_by_domain(const char *domain, char *ip)  {      char **pptr;      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; // 只获取第一个 ip          }      }        return -1;  }    // 获取本机mac  int 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);          close(sd);          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;  }      // 获取本机ip  int 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 device      if (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;  }


getdomainname()与gethostname()函数

原型如下:

#include <unistd.h> 

int gethostname(char *name, size_t len);   返回本地主机的标准主机名。

参数说明

接收缓冲区name,其长度必须为len字节或是更长

接收缓冲区name的最大长度

返回值:如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。

原型如下:

#include <unistd.h> 

int getdomainname(char *name,size_t len); 可以允许程序获得程序正运行的主机的NIS域名。

参数说明:

这个函数的用法也gethostname相同。

例:

#include <unistd.h> #include <stdio.h>#include <errno.h>#include <string.h>int main(){char hostname[250];char dohostname[250];int rt;rt =gethostname(hostname,sizeof(hostname));if(rt == -1) {perror("gethostname fail");return -1;}printf("hostname:%s\n",hostname);rt =getdomainname(dohostname,sizeof(dohostname));if (rt == -1) {perror("getdomainname fail");return -1;}printf("dohostname:%s\n",dohostname);}











原创粉丝点击