網域名稱轉ip位址程式設計實現

2021-07-25 02:52:07 字數 1713 閱讀 3764

linux平台:

首先ip位址在程式設計中有兩種形式,一種是十進位制點分式,如192.168.2.187,另外一種是用乙個32位的整數表示(ipv4)。

struct    hostent ;

typedef uint32_t in_addr_t;

struct in_addr

;

解釋一下:

h_name – 位址的正式名稱。 

h_aliases – 空位元組-位址的預備名稱的指標。 

h_addrtype –位址型別; 通常是af_inet。  

h_length – 位址的位元長度。 

h_addr_list – 零位元組-主機網路位址指標。網路位元組順序。 

h_addr - h_addr_list中的第一位址。 

gethostbyname() 成 功時返回乙個指向結構體 hostent 的指標,或者 是個空 (null) 指標。

雖然看起來h_addr_list[0],看起來是乙個char*,但實際上是乙個uint32_t,這是ip位址的32位整數表示,如果需要轉換成10進製點分法字串表示再呼叫inet_ntoa()函式即可。

下面這個函式演示了具體的用法:

bool connect(const char* pszip, int nport)

else

}else

host = (char*)pszip;

if (socket.connect(host, nport))

return true;

std::cout << "unable to connect to server " << pszip << ":" << nport << std::endl;

return false;

}

這裡的函式無論外部傳入的引數是網域名稱還是ip位址都可以正確呼叫socket的connect()函式進行連線。

注意:在使用 gethostbyname() 的時候,你不能用perror() 列印錯誤資訊 (因為 errno 沒有使用),你應該呼叫 herror()。herror()函式簽名如下:

void herror(const char *s);

另外windows上這個功能也類似:

//pszserver無論是ip位址還是網域名稱都可以正確連線

bool ciusocket::connect(const char* pszserver, short nport)

; struct hostent* phostent = null;

unsigned int addr = 0;

if((addrsrv.sin_addr.s_addr=inet_addr(pszserver)) == inaddr_none)

addrsrv.sin_family = af_inet;

addrsrv.sin_port = htons((u_short)nport);

if(::connect(m_hsocket, (struct sockaddr*)&addrsrv, sizeof(addrsrv)) == socket_error)

return false;

m_bconnected = true;

return true;

}

網域名稱轉IP例程

struct hostent gethostbyname const char name 這個函式的傳入值是網域名稱或者主機名,例如 www.google.cn 等等。傳出值,是乙個hostent的結構。如果函式呼叫失敗,將返回null。struct hostent hostent h name 表...

網域名稱與IP位址

網域名稱系統dns domain name system ip位址是難以記憶與表述的,所以使用網域名稱取代ip位址 網域名稱是賦予伺服器的虛擬位址,dns伺服器負責將虛擬位址 網域名稱 轉化為實際位址 ip位址 所有計算機中都記錄著預設dns伺服器位址,通過預設的dns伺服器獲得網域名稱的相應ip位...

IP位址和網域名稱

ip位址和網域名稱是一對多的關係。乙個ip可以對應多個不同的網域名稱,但是乙個網域名稱只能對應乙個ip位址。就跟人的名字一樣,你可以有多個名字。但是這些名字都是指的你。同名同姓的是例外 拓展資料 2.網域名稱 ip位址畢竟是數字標識,使用時不好記憶和書寫,因此在ip位址的基礎上又發展出一種符號化的位...