使用C語言獲取指定域名的IP


  最近正在學習使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM