gethostbyname() 函數說明

轉載:http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html

gethostbyname()函數說明——用域名或主機名獲取IP地址

?? ?包含頭文件
??? #include <netdb.h>
??? #include <sys/socket.h>

?? ?函數原型
??? struct hostent *gethostbyname(const char *name);
??? 這個函數的傳入值是域名或者主機名,例如"www.google.cn"等等。傳出值,是一個hostent的結構。如果函數調用失敗,將返回NULL。

?? ?返回hostent結構體類型指針
??? struct hostent
??? {
??????? char??? *h_name;????????????? ?
??????? char??? **h_aliases;
??????? int???? h_addrtype;
??????? int???? h_length;
??????? char??? **h_addr_list;
??????? #define h_addr h_addr_list[0]
??? };

??? hostent->h_name
??? 表示的是主機的規范名。例如www.google.com的規范名其實是www.l.google.com。
?? ?
??? hostent->h_aliases
?? ?表示的是主機的別名.www.google.com就是google他自己的別名。有的時候,有的主機可能有好幾個別名,這些,其實都是為了易于用戶記憶而為自己的網站多取的名字。

??? hostent->h_addrtype?? ?
??? 表示的是主機ip地址的類型,到底是ipv4(AF_INET),還是pv6(AF_INET6)

??? hostent->h_length???? ?
??? 表示的是主機ip地址的長度

??? hostent->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。

復制代碼
?1?#include?<netdb.h>
?2?#include?<sys/socket.h>
?3?#include?<stdio.h>
?4?
?5?int?main(int?argc,?char?**argv)
?6?{
?7?????char???*ptr,?**pptr;
?8?????struct?hostent?*hptr;
?9?????char???str[32];
10?????ptr?=?argv[1];
11?
12?????if((hptr?=?gethostbyname(ptr))?==?NULL)
13?????{
14?????????printf("?gethostbyname?error?for?host:%s\n",?ptr);
15?????????return?0;
16?????}
17?
18?????printf("official?hostname:%s\n",hptr->h_name);
19?????for(pptr?=?hptr->h_aliases;?*pptr?!=?NULL;?pptr++)
20?????????printf("?alias:%s\n",*pptr);
21?
22?????switch(hptr->h_addrtype)
23?????{
24?????????case?AF_INET:
25?????????case?AF_INET6:
26?????????????pptr=hptr->h_addr_list;
27?????????????for(;?*pptr!=NULL;?pptr++)
28?????????????????printf("?address:%s\n",
29????????????????????????inet_ntop(hptr->h_addrtype,?*pptr,?str,?sizeof(str)));
30?????????????printf("?first?address:?%s\n",
31????????????????????????inet_ntop(hptr->h_addrtype,?hptr->h_addr,?str,?sizeof(str)));
32?????????break;
33?????????default:
34?????????????printf("unknown?address?type\n");
35?????????break;
36?????}
37?
38?????return?0;
39?}
復制代碼

編譯運行
-----------------------------
# gcc test.c
# ./a.out www.baidu.com
official hostname:www.a.shifen.com
alias:www.baidu.com
address:121.14.88.11
address:121.14.89.11
first address: 121.14.88.11

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384387.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux網絡編程(三)select、poll和epoll

linux網絡編程&#xff08;三&#xff09;select、poll和epoll一、為什么會有多路I/O轉接服務器&#xff1f;二、select三、poll三、epoll一、為什么會有多路I/O轉接服務器&#xff1f; 為什么會有多路I/O轉接服務器呢&#xff1f;在學這個之前&#xff0c;我們同使用的是多線…

Linux socket編程(一) 對套接字操作的封裝

轉載:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 以前寫的&#xff0c;現在回顧一下&#xff1a; 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.…

數據結構(二)棧

棧一、棧順序棧線性棧(不帶頭結點)線性棧(帶頭結點)共享棧一、棧 棧是只允許在一端進行插入或刪除操作的線性表。 棧頂&#xff1a;線性表允許進行插入刪除的那一端 棧底&#xff1a;固定的&#xff0c;不允許進行插入和刪除的那一端 空棧&#xff1a;不含如何元素的空表 順序…

如何在linux上安裝sqlite數據庫

如何在linux上安裝sqlite數據庫一、下載二、解壓三、配置&#xff08;configure&#xff09;四、編譯和安裝五、執行sqlite3程序六、測試代碼一、下載 首先要先下載sqlite3源碼包 鏈接&#xff1a;https://pan.baidu.com/s/1_70342ZLlPjLlqGzpy5IHw 提取碼&#xff1a;84ne …

數據結構(三)隊列

數據結構&#xff08;三&#xff09;隊列隊列隊列&#xff08;順序存儲&#xff09;循環隊列&#xff08;順序存儲&#xff09;隊列&#xff08;鏈式存儲&#xff09;隊列 隊列是一種受限制的線性表&#xff0c;只允許表的一端插入&#xff0c;在表的另一端刪除 隊列&#xf…

Linux fcntl函數詳解

轉載&#xff1a;http://www.cnblogs.com/xuyh/p/3273082.html 功能描述&#xff1a;根據文件描述詞來操作文件的特性。 文件控制函數 fcntl -- file control 頭文件&#xff1a; #include <unistd.h> #include <fcntl.h> 函數原型&#xff1a; …

vs2019使用sqlite數據庫遠程連接linux

vs2019使用sqlite數據庫遠程連接linux一、sqlite3添加到目錄二、添加依賴庫三、測試一、sqlite3添加到目錄 將兩個sqlite3頭文件放入目錄中 二、添加依賴庫 打開項目屬性 添加完成 三、測試 #include <stdio.h> #include <sqlite3.h>int main(int argc, cha…

linux網絡編程(四)線程池

linux網絡編程&#xff08;四&#xff09;線程池為什么會有線程池&#xff1f;實現簡單的線程池為什么會有線程池&#xff1f; 大多數的服務器可能都有這樣一種情況&#xff0c;就是會在單位時間內接收到大量客戶端請求&#xff0c;我們可以采取接受到客戶端請求創建一個線程的…

AIGC:大語言模型LLM的幻覺問題

引言 在使用ChatGPT或者其他大模型時&#xff0c;我們經常會遇到模型答非所問、知識錯誤、甚至自相矛盾的問題。 雖然大語言模型&#xff08;LLMs&#xff09;在各種下游任務中展示出了卓越的能力&#xff0c;在多個領域有廣泛應用&#xff0c;但存在著幻覺的問題&#xff1a…

關于C++子類父類成員函數的覆蓋和隱藏

轉載&#xff1a;http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函數的覆蓋 覆蓋發生的條件&#xff1a; &#xff08;1&#xff09; 基類必須是虛函數&#xff08;使用virtual 關鍵字來進行聲明&#xff09; &#xff08;2&#xff09;發生覆蓋的兩個函…

數據結構(四)串的順序存儲

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定長順序存儲 typedef struct {char ch[MAXLEN]; //每個分量存儲一個字符int length; //串的實際長度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;char* …

數據結構(四)串的動態數組存儲

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定長順序存儲 typedef struct {char* ch; //每個分量存儲一個字符int length; //串的實際長度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;T.ch (char*)m…

C++名字隱藏

轉載&#xff1a;http://www.weixueyuan.net/view/6361.html 如果派生類中新增一個成員變量&#xff0c;該成員變量與基類中的成員變量同名&#xff0c;則新增的成員變量就會遮蔽從基類中繼承過來的成員變量。同理&#xff0c;如果派生類中新增的成員函數與基類中的成員函數同…

c語言深入淺出(一)strcpy和memcpy的區別

c語言深入淺出&#xff08;一&#xff09;strcpy和memcpy的區別strcpy和memcpy都是c語言的庫函數 strcpy:只用于字符串的復制&#xff0c;當碰到‘\0’就停止了 memcpy:用于這個內存的拷貝&#xff0c;適用于結構體、字符數組、類等 char * strcpy(char * dest, const char * s…

C++ dynamic_cast操作符

轉載&#xff1a;http://www.weixueyuan.net/view/6377.html 在C中&#xff0c;編譯期的類型轉換有可能會在運行時出現錯誤&#xff0c;特別是涉及到類對象的指針或引用操作時&#xff0c;更容易產生錯誤。Dynamic_cast操作符則可以在運行期對可能產生問題的類型轉換進行測試。…

數據結構(五)樹

數據結構&#xff08;五&#xff09;樹一、基本操作樹是n個節點的有限集&#xff0c;它是一種遞歸的數據結構 一、基本操作 #include <stdio.h> #include <stdlib.h> #include <iostream>#define Elemtype charusing namespace std; typedef struct BiTNod…

C++ typeid操作符

轉載&#xff1a;http://www.weixueyuan.net/view/6378.html typeid操作符用于判斷表達式的類型&#xff0c;注意它和sizeof一樣是一個操作符而不是函數。如果需要使用typeid操作符&#xff0c;最好加上typeinfo頭文件。 給出以下定義 int a;double b;char * c;long d; 下表列…

數據結構(五)層次遍歷

數據結構&#xff08;五&#xff09;層次遍歷// linear_listqueue.cpp : This file contains the main function. Program execution begins and ends there. //#include <iostream> #include <stdlib.h> #include <stdio.h> #define ElemType BiTree using …

C++成員函數指針的應用

轉載&#xff1a;http://www.cppblog.com/colys/archive/2009/08/18/25785.html C中&#xff0c;成員指針是最為復雜的語法結構。但在事件驅動和多線程應用中被廣泛用于調用回叫函數。在多線程應用中&#xff0c;每個線程都通過指向成員函數的指針來調用該函數。在這樣的應用中…

cv2.VideoCapture()無法打開視頻解決方法

cv2.VideoCapture無法打開視頻解決方法問題解決方法問題 cv2.VideoCapture打開mp4文件&#xff0c;直接報錯 解決方法 我們打開D:\opencv_3.4.2_Qt\opencv_3.4.2_Qt\x86\bin\&#xff08;opencv的dll動態庫中找到&#xff09; 找到opencv_ffmpeg342.dll文件&#xff0c;放入…