当前位置: 首页 > news >正文

哪个网站设计好合肥瑶海区网站建设方案

哪个网站设计好,合肥瑶海区网站建设方案,免费建站长平台网站,滨州网站建设哪家专业在进行 Linux 网络编程时#xff0c;经常会需要获取本机 IP 地址#xff0c;除了常规的读取配置文件外#xff0c;本文罗列几种个人所知的编程常用方法#xff0c;仅供参考#xff0c;如有错误请指出。 方法一#xff1a;使用 ioctl() 获取本地 IP 地址 Linux 下可以使用…  在进行 Linux 网络编程时经常会需要获取本机 IP 地址除了常规的读取配置文件外本文罗列几种个人所知的编程常用方法仅供参考如有错误请指出。 方法一使用 ioctl() 获取本地 IP 地址 Linux 下可以使用 ioctl() 函数以及结构体 struct ifreq 和结构体struct ifconf 来获取网络接口的各种信息。具体过程是先通过 ictol 获取本地所有接口的信息保存到 ifconf 结构中再从其中取出每个 ifreq 表示的接口信息。 如果本机的 IP 地址绑定在第一块网卡上则只需指定网卡名称无需获取所有网卡的信息即可获取见如下函数 int get_localip(const char * eth_name, char *local_ip_addr) {int ret -1;register int fd;struct ifreq ifr;if (local_ip_addr NULL || eth_name NULL){return ret;}if ((fdsocket(AF_INET, SOCK_DGRAM, 0)) 0){strcpy(ifr.ifr_name, eth_name);if (!(ioctl(fd, SIOCGIFADDR, ifr))){ret 0;strcpy(local_ip_addr, inet_ntoa(((struct sockaddr_in *)ifr.ifr_addr)-sin_addr));}}if (fd 0){close(fd);}return ret; }如果想通过获取所有网络接口信息示例代码如下 #include stdio.h #include net/if.h #include string.h #include unistd.h #include arpa/inet.h #include sys/ioctl.h #include netinet/in.hint get_localip(const char * eth_name, char *local_ip_addr) {int ret -1;register int fd, intrface;struct ifreq ifr[32];struct ifconf ifc;if (local_ip_addr NULL || eth_name NULL){return ret;}if ((fdsocket(AF_INET, SOCK_DGRAM, 0)) 0){ifc.ifc_len sizeof ifr;ifc.ifc_buf (caddr_t)ifr;if (!ioctl(fd, SIOCGIFCONF, (char*)ifc)) //获取所有接口信息{intrface ifc.ifc_len / sizeof(struct ifreq);while (intrface-- 0){//Get IP Addressif (!(ioctl(fd, SIOCGIFADDR, (char*)ifr[intrface]))){if(strcmp(eth_name, ifr[intrface].ifr_name) 0){ret 0;sprintf(local_ip_addr, %s, inet_ntoa(((struct sockaddr_in*)(ifr[intrface].ifr_addr))-sin_addr));break;}}}}}if (fd 0){close(fd);}return ret; }int main(int argc, const char **argv) {int ret;char local_ip[20] {0};ret get_localip(eth0, local_ip);if (ret 0){printf(local ip:%s\n, local_ip);}else{printf(get local ip failure\n);}return 0; }方法二getsockname() 获取本地 IP 地址 getsockname()用于获取一个已捆绑或已连接套接字的本地地址。若一个套接字与 INADDR_ANY 捆绑也就是说该套接字可以用任意主机的地址此时除非调用 connect() 或 accept() 来连接否则 getsockname() 将不会返回主机 IP 地址的任何信息。 示例代码 #include stdio.h #include errno.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h #include netinet/in.h#define PORT 80 #define SERVER_IP 192.168.10.31int main(int argc, const char **argv) {int ret -1;socklen_t len;char buf[30] {0};struct sockaddr_in server_addr, local_addr;int fd socket(AF_INET, SOCK_STREAM, 0);//int fd socket(AF_INET, SOCK_DGRAM, 0);if (fd 0){printf(fail to creat socket\n);return -1;}memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(PORT);server_addr.sin_addr.s_addr inet_addr(SERVER_IP);if(connect(fd, (struct sockaddr*)server_addr, sizeof(server_addr))0){printf(connect error!!!\n);goto end;}len sizeof(local_addr);memset(local_addr, 0, sizeof(local_addr));ret getsockname(fd, (struct sockaddr*)local_addr, len);if (ret 0){printf(local ip is %s, local port is %d\n, inet_ntop(AF_INET, local_addr.sin_addr, buf, sizeof(buf)), ntohs(local_addr.sin_port));}else{printf(getsockname failed, error%d\n, errno);}end:if (fd){close(fd);}return ret; }方法三getaddrinfo() 获取本地 IP 地址 getaddrinfo() 可以完成网络主机中主机名和服务名到地址的映射但是一般不能用来获取本地 IP 地址当它用来获取本地 IP 地址时返回的一般是 127.0.0.1 本地回环地址且该函数仅仅支持 IPv4。 示例代码 #include netdb.h #include stdio.h #include unistd.h #include arpa/inet.h// 获取本地IP时一般都是127.0.0.1 int main(int argc, const char **argv) {int ret;char host_name[128] {0};struct addrinfo *res, *cur;struct sockaddr_in *addr;if (gethostname(host_name, sizeof(host_name)) 0){printf(gethostname error\n);return -1;}ret getaddrinfo(host_name, NULL, NULL, res);if (ret ! 0){printf(Error: error in getaddrinfo on hostname: %s\n, gai_strerror(ret));return -1;}for(cur res; cur ! NULL; cur cur-ai_next){if(cur-ai_family AF_INET){addr (struct sockaddr_in*)cur-ai_addr;printf(local ip:%s\n, inet_ntoa(addr-sin_addr));}//char host[1024] {0};//ret getnameinfo(cur-ai_addr, cur-ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);//if(ret ! 0)//{// printf(getnameinfo: %s\n, gai_strerror(ret));//}//else//{// printf(ip: %s\n, host);//}}freeaddrinfo(res);return 0; }方法四gethostbyname() 获取本地 IP 地址 gethostbyname() 和 getaddrinfo() 的功能类似一般用于通过主机名或者服务名比如域名来获取主机的 IP 地址。但是要想获取本地 IP 地址的时候一般获取的是回环地址 127.0.0.1。 示例代码 #include netdb.h #include stdio.h #include unistd.h #include arpa/inet.h// 获取本地IP时一般都是127.0.0.1 int main(int argc, const char **argv) {int i 0;char host_name[128] {0};struct hostent *hptr;if (gethostname(host_name, sizeof(host_name)) 0){printf(gethostname error\n);return -1;}if ((hptrgethostbyname(host_name)) NULL){printf(gethostbyname error\n);return -1;}while(hptr-h_addr_list[i] ! NULL){printf(hostname: %s\n, hptr-h_name);printf( ip: %s\n, inet_ntoa(*(struct in_addr*)hptr-h_addr_list[i]));i;}return 0; }方法五通过 getifaddrs() 获取本地 IP 地址 代码来自StackOverflow:http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer 这里解释一下代码中的 INET_ADDRSTRLEN 和 INET6_ADDRSTRLEN 该宏变量是定义在 netinet/in.h 头文件中 // FILE: netinet/in.h#define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */#define INET6_ADDRSTRLEN 46 /* for IPv6 hex string */示例代码 #include stdio.h #include sys/types.h #include ifaddrs.h #include netinet/in.h #include string.h #include arpa/inet.hint main (int argc, const char * argv[]) {struct ifaddrs * ifAddrStructNULL;struct ifaddrs * ifaNULL;void * tmpAddrPtrNULL;getifaddrs(ifAddrStruct);for (ifa ifAddrStruct; ifa ! NULL; ifa ifa-ifa_next){if (!ifa-ifa_addr){continue;}if (ifa-ifa_addr-sa_family AF_INET) // check it is IP4{// is a valid IP4 AddresstmpAddrPtr((struct sockaddr_in *)ifa-ifa_addr)-sin_addr;char addressBuffer[INET_ADDRSTRLEN];inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);printf(%s IP Address %s\n, ifa-ifa_name, addressBuffer);}else if (ifa-ifa_addr-sa_family AF_INET6) // check it is IP6{// is a valid IP6 AddresstmpAddrPtr((struct sockaddr_in6 *)ifa-ifa_addr)-sin6_addr;char addressBuffer[INET6_ADDRSTRLEN];inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);printf(%s IP Address %s\n, ifa-ifa_name, addressBuffer);}}if (ifAddrStruct!NULL){freeifaddrs(ifAddrStruct);}return 0; }方法六通过 popen() 调用 ifconfig 获取本地 IP 地址 用popen() 建立一个管道管道的一端执行命令 ifconfig管道的另一端读取收到的数据并进行相应的解析。这种方法需要执行 shell 命令配合正则表达式效率较低一般不采用。而这种方式其实更倾向于配置原因就是使用简单。 示例代码 #include stdio.h #include stdlib.h#define ETH_NAME ens33int main(int argc, const char *argv[]) {FILE *fp;char buf[256] {0};char command[256] {0};//char *fmt ifconfig %s|sed -n 2p|sed -n s#^.*dr:##gp|sed -n s#B.*$##gp;char *fmt ifconfig %s|grep inet addr|awk { print $2} | awk -F: {print $2};snprintf(command, sizeof(command), fmt, ETH_NAME);if((fp popen(command, r)) NULL){perror(Fail to popen\n);return -1;}while(fgets(buf, sizeof(buf), fp) ! NULL){printf(%s, buf);}pclose(fp);return 0; }参考文章 [1] https://blog.csdn.net/bailyzheng/article/details/7489656 [2] https://blog.csdn.net/k346k346/article/details/48231933 [3] https://blog.csdn.net/zhongmushu/article/details/89944990
http://www.hkea.cn/news/14265642/

相关文章:

  • 网站服务器解决方案前端开发工资
  • google移动网站建站十大原则购物网站开发设计类图
  • 域名备案通过后怎么做网站wordpress透明主题下载
  • 用ps做网站首页顶部图片网站建设论文附录怎么写
  • 北京哪家公司做网站网站开发合作合同范本
  • 制作企业网站方案团购模板网站
  • 成都网站建设培训分享此博文wordpress
  • 广州外贸公司联系方式网站seo诊断评分63
  • 天津最好网站建设公司做产品网站要备案吗
  • 漯河做网站zrguwordpress如何自定义页面
  • 漳州商城网站建设桂林 网站 制作
  • 网站建设艾金手指六六12网站活动策划方案
  • 关于春节的网站设计html南京网站制作公司排名前十
  • 广西省住房和城乡建设厅网站微信网站开发源代码
  • 网站以下内容未做缓存百度云登录入口官网
  • 玉林做网站的公司企业网站推广哪家好
  • 仿素材网站乌克兰服务器
  • 萧山工程建设有限公司网站网站备案抽查号码
  • 网站开发 产品经理网站内容管理系统怎么用
  • 刷赞网站怎么做的眉山市网站建设
  • 技术支持 天空网络-临汾做网站建网站学什么软件
  • 福州企业网站建站模板外贸展示型模板网站模板下载
  • 餐饮企业网站设计什么是网站名
  • 学校网站制作公司青岛建设网站的公司
  • 做企业网站专用词传奇游戏排行榜前十名
  • jsp电商网站开发流程公司建设网站的费用吗
  • 合肥市公司网站建设签署网站建设协议新闻
  • 快速建站实例演示完整版汕头市住房和城乡建设局网站
  • 网站建设与维护项目六平台企业采用劳务派遣方式用工的
  • 古色古香的网站模板项目建设备案网站