最近正在學習使用C語言發送電子郵件,但是發送郵件需要連接到SMTP服務器,C語言只支持連接IP,而不支持連接域名,那么就需要將SMTP地址轉換成IP地址了。雖然我們可以使用DOS命令中的ping命令來將SMTP服務器的IP地址轉換出來,但這並不是我的本意。在網上找貼半天,實在是讓人無語。最后,自己終於研究出來,故發表出來,希望能夠幫助到大家。
如果要將一個域名轉換成一個IP地址,需要使用到Winsock中的函數gethostbyname。相反,如果我們想將一個IP地址轉換成一個域名,則使用gethostbyaddr。今天,我們主要來詳細講解gethostbyname。
struct hostent FAR *PASCAL FAR gethostbyname(const char FAR * name);
其中,name指的是指向一個域名的指針,該函數返回的是一個hostent型的結構體。
結構體定義如下:
struct hostent { char FAR * h_name; char FAR * FAR * h_aliases; short h_addrtype; short h_length; char FAR * FAR * h_addr_list; };
| hostent->h_name | 指的是主機的規范名,例如www.google.com.hk的規范名其實是www-wide.l.google.com |
| hostent->h_aliases | 指的是主機的別名,例如www.google.com.hk就是google他自己的別名,有時候,有的主機有好幾個別名,這些其實都是為了易於用戶的記憶而為自己的網站多取的名字 |
| hostent->h_addrtype | 指的是主機IP地址的類型,可能是IPV4(AF_INET)或者是IPV6(AF_INET6) |
| hostent->h_length | 指的是主機IP地址的長度,如果是IPV4,則是4 |
| hostent->h_addr_list | 表示主機的IP地址,需要使用inet_ntoa轉換成字符串格式的IP地址。IP地址可能有1——更多個。 |
inet_ntoa函數將一個IP轉換成一個互聯網標准點分格式的字符串。
char FAR * inet_ntoa( struct in_addr in);
注意:如果使用inet_ntoa轉換hostent->h_addr_list,需要強制轉換成struct in_addr *格式。
下面是源代碼例程
char * smtpIp(char * url) { HOSTENT * iphost; char ipconfig[20]; if((iphost = gethostbyname(url)) != NULL) { int i = 0; while(iphost->h_addr_list[i]) { char ip[20]; memcpy(&ip, inet_ntoa(*((struct in_addr *)iphost->h_addr_list[i])), 20); printf("%s", ip); memset(ip, '\0', 20); i++; } } }
注意:在調用任何Winsock函數之前,必須先調用WSAStartup函數
轉載本文請注明來源:www.cnblogs.com/cnlyml
