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位址的基礎上又發展出一種符號化的位...