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);}
阅读全文
0 0
- Linux c 网络编程
- Linux c 网络编程
- Linux C 网络编程
- Linux C 网络编程
- linux c 网络编程
- Linux C 网络编程
- Linux C编程---网络编程
- Linux C编程网络编程
- Linux C编程---网络编程
- Linux C编程---网络编程
- linux-C编程-网络编程
- Linux C编程---网络编程
- linux-C编程-网络编程
- Linux c 网络socket编程
- Linux c 网络socket编程
- linux c 网络编程 并发
- linux c 网络编程学习
- linux C 网络编程基础
- tomcat启动本地正常访问,别的机器访问失败
- (6)设计模式之策略模式(结构型模式)
- TFRecord —— tensorflow 下的统一数据存储格式
- 如何为SugarCRM的快捷操作栏增加一个按钮?
- select标签
- Linux C 网络编程
- Spark的性能调优
- iOS NSUserDefault存储自定义对象
- Windows系统下搭建Redis
- MVP框架
- Jedis相关操作api---哈希
- 使用HttpComponents抓取网页内容
- OGG-01044 错误
- EditText不使用系统软键盘(但是不印象其他功能,通过反射)