亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c/c++實現獲取域名的IP地址

2020-01-26 14:50:02
字體:
來源:轉載
供稿:網友

c/c++實現獲取域名的IP地址

// GetHostIP.cpp : 定義控制臺應用程序的入口點。// #include "stdafx.h" #include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <windows.h>#pragma comment(lib, "ws2_32.lib") int main(int argc, char **argv){   //-----------------------------------------  // Declare and initialize variables  /*  *  WSADATA結構被用來儲存調用AfxSocketInit全局函數返回的Windows Sockets初始化信息。  *  這個結構被用來存儲被WSAStartup函數調用后返回的Windows Sockets數據。它包含Winsock.dll執行的數據。  */  WSADATA wsaData;  int iResult;   DWORD dwError; /*每個word為2個字節的長度,DWORD 雙字即為4個字節,每個字節是8位*/  int i = 0;   struct hostent *remoteHost;     /*域名*/  char *host_name;          /*主機名*/  struct in_addr addr;        /*ip*/   char **pAlias;   // Validate the parameters  if (argc != 2) {    printf("usage: GetHostIP hostname/n");    return 1;  }  // 此處應添加的程序如下  // 1. 當初始化winsocket  iResult = WSAStartup(MAKEWORD(2,2),&wsaData);/* & 取地址*/  // 2. 檢查該socket是否初始化成功,即該socket是否等于0;如果初始化不成功,應當給出錯誤報警,并結束程序。  if(iResult!=0){    printf("初始化失敗!/n");    return 1;  }   /////////////////結束///////////////////////////////////    host_name = argv[1];  printf("Calling gethostbyname with %s/n", host_name);  // 此處應添加的程序如下  // 1. 利用函數gethostbyname(),獲取給定主機名的指針。  remoteHost = gethostbyname(host_name);  // 2. 應當熟悉該結構指針的結構  // 其中該函數申明如下:struct hostent* gethostbyname(const char *name)      // 此處應添加的程序如下  // 1. 如果上面函數返回的主機結構指針為空(NULL),則做如下處理:  //   a. 利用函數 int WSAGetLastError ( void ) 檢查當前是否發生網絡錯誤,  //   b. 返回的發生的錯誤類型并作相應的處理,比如,若沒有找到主機的錯誤(此時該函數返回WSAHOST_NOT_FOUND)  if(remoteHost == NULL){    //printf("gethostbynameError:%d",WSAGetLastError());    return 1;  }else{  // 2. 如果返回的主機指針不為空,則做如下處理:  //   a. 打印出如下參數:主機名和IP地址,若該主機對應于多個ip地址,應當分別列出。    printf("主機名:%s/n",remoteHost->h_name);    for(i=0;;i++){      if(remoteHost->h_addr_list[i]!=0)      {      /*從緩存中把 p 拷貝到addr中      *同時addr.S_un.Saddr      * in_addr ipAddr;       * ipAddr.S_un.S_addr = inet_addr("127.0.0.1");       * 就是把字符串形式的ip地址轉化為0xXXXXXXXX形式的地址格式。      */        addr.s_addr = *(u_long*)remoteHost->h_addr_list[i];         printf("ip #%d:%s/n",i,inet_ntoa(addr)); /* inet_ntoa() 函數將網絡地址轉成二進制的數字相關函數:inet_aton, inet_ntoa */      }    /*    for(i=0;;i++){      char *p = remoteHost->h_addr_list[i];      if(p==NULL) break;      /*從緩存中把 p 拷貝到addr中      *同時addr.S_un.Saddr      * in_addr ipAddr;       * ipAddr.S_un.S_addr = inet_addr("127.0.0.1");       * 就是把字符串形式的ip地址轉化為0xXXXXXXXX形式的地址格式。      *      memcpy(&addr.S_un.S_addr,p,remoteHost->h_length);       printf("ip地址為:%s/n",inet_ntoa(addr));         */         }       }       // 此處應添加的程序如下  // 程序完成后應當適當測試,需要進行的測試如下:  // 1. 測試主機結構指針獲取失敗  // 2. 測試包含多個IP地址的主機  // 3. 你能想到的任何可能出現的異常情況  /////////////////結束///////////////////////////////////        system("pause"); /*防止窗體關閉函數*/  return 0;}

下面給大家詳細介紹下上面代碼的核心gethostbyname的詳細用法

使用這個東西,首先要包含2個頭文件:

#include <netdb.h>#include <sys/socket.h>struct hostent *gethostbyname(const char *name);

這個函數的傳入值是域名或者主機名,例如"傳出值,是一個hostent的結構(如下)。如果函數調用失敗,將返回NULL。

解釋一下這個結構, 其中:

char *h_name 表示的是主機的規范名。例如www.google.com的規范名其實是www.l.google.com。
char **h_aliases 表示的是主機的別名。www.google.com就是google他自己的別名。有的時候,有的主機可能有好幾個別名,這些,其實都是為了易于用戶記憶而為自己的網站多取的名字。
int h_addrtype 表示的是主機ip地址的類型,到底是ipv4(AF_INET),還是ipv6(AF_INET6)
int h_length 表示的是主機ip地址的長度
int **h_addr_lisst 表示的是主機的ip地址,注意,這個是以網絡字節序存儲的。千萬不要直接用printf帶%s參數來打這個東西,會有問題的哇。所以到真正需要打印出這個IP的話,需要調用inet_ntop()。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
這個函數,是將類型為af的網絡地址結構src,轉換成主機序的字符串形式,存放在長度為cnt的字符串中。
這個函數,其實就是返回指向dst的一個指針。如果函數調用錯誤,返回值是NULL。
下面是例程,有詳細的注釋。

#include <netdb.h>#include <sys/socket.h>int main(int argc, char **argv){char *ptr,**pptr;struct hostent *hptr;char str[32];/* 取得命令后第一個參數,即要解析的域名或主機名 */ptr = argv[1];/* 調用gethostbyname()。調用結果都存在hptr中 */if( (hptr = gethostbyname(ptr) ) == NULL ){printf("gethostbyname error for host:%s/n", ptr);return 0; /* 如果調用gethostbyname發生錯誤,返回1 */}/* 將主機的規范名打出來 */printf("official hostname:%s/n",hptr->h_name);/* 主機可能有多個別名,將所有別名分別打出來 */for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)printf(" alias:%s/n",*pptr);/* 根據地址類型,將地址打出來 */switch(hptr->h_addrtype){case AF_INET:case AF_INET6:pptr=hptr->h_addr_list;/* 將剛才得到的所有地址都打出來。其中調用了inet_ntop()函數 */for(;*pptr!=NULL;pptr++)printf(" address:%s/n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));break;default:printf("unknown address type/n");break;}return 0;} 

另外附上獲得公網與內網ip的代碼:

bool getPublicIp(string& ip){  int  sock;  char **pptr = NULL;  struct sockaddr_in  destAddr;  struct hostent  *ptr = NULL;  char destIP[128];  sock = socket(AF_INET,SOCK_STREAM,0);  if( -1 == sock ){    perror("creat socket failed");    return false;  }  bzero((void *)&destAddr,sizeof(destAddr));  destAddr.sin_family = AF_INET;  destAddr.sin_port = htons(80);  ptr = gethostbyname("www.ip138.com");  if(NULL == ptr){    perror("gethostbyname error");    return false;  }  for(pptr=ptr->h_addr_list ; NULL != *pptr ; ++pptr){    inet_ntop(ptr->h_addrtype,*pptr,destIP,sizeof(destIP));    printf("addr:%s/n",destIP);    ip = destIP;    return true;  }  return true;}

獲取內網IP

int getlocalip(char* outip){#ifndef WIN32	int i=0;	int sockfd;	struct ifconf ifconf;	char buf[512];	struct ifreq *ifreq;	char* ip;	//初始化ifconf	ifconf.ifc_len = 512;	ifconf.ifc_buf = buf;	strcpy(outip,"127.0.0.1");	if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)	{		return -1;	}	ioctl(sockfd, SIOCGIFCONF, &ifconf);  //獲取所有接口信息	close(sockfd);	//接下來一個一個的獲取IP地址	ifreq = (struct ifreq*)buf;	for(i=(ifconf.ifc_len/sizeof(struct ifreq)); i>0; i--)	{		ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);		if(strcmp(ip,"127.0.0.1")==0) //排除127.0.0.1,繼續下一個		{			ifreq++;			continue;		}	}	strcpy(outip,ip);	return 0;#else	return 0;#endif	}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品91av| 色999日韩欧美国产| 国产精品视频久久久久| 成人福利网站在线观看| 日韩中文在线视频| 激情av一区二区| 91免费在线视频| 精品日韩视频在线观看| 久久手机精品视频| 亚洲综合自拍一区| 伊人久久久久久久久久久久久| 久久人人爽人人爽人人片av高清| 亚洲精品www久久久久久广东| 国产成人欧美在线观看| 日韩av在线高清| 国产精品精品视频一区二区三区| 日韩高清免费观看| 亚洲成成品网站| 亚洲视频视频在线| 久久久久久综合网天天| 欧美久久精品一级黑人c片| 国产精品国内视频| 久久久91精品国产| 国产一区二区三区直播精品电影| 中文字幕日韩专区| 91国产视频在线| 亚洲成人久久久久| 亚洲激情成人网| 亚洲午夜av久久乱码| 免费av一区二区| 亚洲a成v人在线观看| 久久精品视频在线| 国产精品自产拍在线观| 高清欧美性猛交xxxx黑人猛交| 国产国产精品人在线视| 国产日韩换脸av一区在线观看| 欧美日韩一区二区三区| 最近2019年好看中文字幕视频| 亚洲女人天堂视频| 亚洲欧美一区二区三区久久| 欧美在线亚洲一区| 亚洲色图日韩av| 亚洲精品之草原avav久久| 久久久99久久精品女同性| 欧美日韩免费看| 国产精品久久久久高潮| 欧美怡红院视频一区二区三区| 日韩在线视频中文字幕| 亚洲色图35p| 欧美精品福利视频| 欧美日韩ab片| 成人中文字幕+乱码+中文字幕| 中文字幕在线看视频国产欧美在线看完整| 91精品国产色综合久久不卡98| 亚洲xxx视频| 亚洲国产精品一区二区三区| 欧美韩国理论所午夜片917电影| 在线不卡国产精品| 国产成人精品久久亚洲高清不卡| 久久免费视频在线观看| 久久久久久一区二区三区| 欧美日韩国产一区二区三区| 亚洲精品美女在线| 亚洲2020天天堂在线观看| 成人在线一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品美女视频网站| 亚洲国产精品美女| 久国内精品在线| 久久91亚洲人成电影网站| 精品久久久久久久久久| 亚洲精品日韩丝袜精品| 亚洲精品乱码久久久久久金桔影视| 最近2019年日本中文免费字幕| 久久久av电影| 欧美在线视频在线播放完整版免费观看| 亚洲电影免费观看高清完整版| 欧美在线日韩在线| 97热在线精品视频在线观看| 精品无人国产偷自产在线| 国产成人黄色av| 亚洲色图17p| 69av视频在线播放| 在线看国产精品| 中文国产亚洲喷潮| 96sao精品视频在线观看| 成人免费观看49www在线观看| 国产精品毛片a∨一区二区三区|国| 播播国产欧美激情| 亚洲精品乱码久久久久久金桔影视| 亚洲白虎美女被爆操| 国产精品88a∨| 美乳少妇欧美精品| 亚洲成在人线av| 夜夜躁日日躁狠狠久久88av| 午夜精品一区二区三区av| 国产精品欧美在线| 成人av番号网| 欧美一级淫片videoshd| 欧美性受xxxx白人性爽| 91精品国产综合久久久久久蜜臀| 色偷偷av一区二区三区乱| 亚洲精品自产拍| 91精品国产91久久久久久不卡| 97在线看免费观看视频在线观看| 亚洲国产精品va在线看黑人| 国产精品无av码在线观看| 欧美成人剧情片在线观看| 日韩毛片在线观看| 亚洲国产精品va在线看黑人| 亚洲一区免费网站| 欧美大片欧美激情性色a∨久久| 久久视频精品在线| 欧美日韩国产黄| 欧美激情一区二区三区高清视频| 欧美日韩精品在线视频| 国产成人一区二区三区小说| 国产精品久久久久免费a∨| 国产精品久久久久久网站| 日韩欧美中文字幕在线播放| 欧美性猛交xxxx乱大交| 91免费欧美精品| 亚洲国产精品久久| 在线性视频日韩欧美| 91精品国产亚洲| 精品国产一区二区在线| 日韩综合中文字幕| 成人免费网站在线看| 欧美丰满少妇xxxxx| 国产精品日日做人人爱| 亚洲xxx大片| 伦伦影院午夜日韩欧美限制| 国产精品激情av电影在线观看| 日韩中文字幕视频| 国产九九精品视频| 欧美丰满少妇xxxx| 欧美电影在线免费观看网站| 夜夜躁日日躁狠狠久久88av| 日韩av在线一区二区| 亚洲色图第三页| 青青久久av北条麻妃海外网| 狠狠躁夜夜躁久久躁别揉| 亚洲第一页自拍| 国产精品视频中文字幕91| 亚洲免费视频在线观看| 亚洲亚裔videos黑人hd| 成人在线播放av| 色妞在线综合亚洲欧美| 国产精品亚洲第一区| 欧美激情伊人电影| 国产精品久久久久久久app| 在线看日韩av| 一本色道久久88综合亚洲精品ⅰ| 热re99久久精品国产66热| 成人网在线观看| 成人高清视频观看www| 久久精品中文字幕免费mv| 欧美韩国理论所午夜片917电影| 亚洲精品成人久久| 久久精品男人天堂| 欧美激情中文字幕乱码免费| 亚洲一区二区三| 国产日韩在线视频| 国产999在线观看|