1. 程式人生 > >gethostbyname()不成功的可能原因!

gethostbyname()不成功的可能原因!

本文摘自:http://blog.163.com/[email protected]/blog/static/4243883720091025102830596/


         gethostbyname()使用該函式可以將一個伺服器的域名轉化成該伺服器的IP地址;要注意的是一臺伺服器的域名可以對應多個不同的IP,也就是說你通過google域名來訪問google伺服器時,你在不同的時刻訪問可能登陸的是google的不同計算機。為什麼不直接用IP地址而用域名?這個問題我已經在我的另外一篇博文《如何將域名地址轉換成對應的IP地址?》 說明過。

        在解釋該函式執行不成功的一個原因之前,我們有必要了解一下該函式的引數和返回值。

函式原型:    

struct hostent FAR* gethostbyname( const char FAR* name );

name:是一個指標,該指標指向的是要被解析的主機名字串,以NULL結尾。

返回值:是一個指標,指向一個struct hostent型別的指標。

在使用該函式要注意的是:

     (1) name指標指向的字串,必須是主機名字串;舉個例子:比如我們要登入 google主頁,這要在瀏覽器裡輸入http://www.google.com/, 所謂的主機名字串指的是去掉“http://”頭剩下的部分“www.google.com”,如果使用“http://www.google.com/

”該函式執行就不會得到真確的結果。

      (2)我們要了解一下結構體     struct hostent

               struct hostent {

                                          char FAR* ;

                                        };     

           該結構體成員的詳細解釋請參閱MSDN,我這裡要提醒一下的是 成員 ,該成員是一個指向指標的指標型別變數,也就是一個指向指標陣列的指標,在陣列的每一個成員都指向一個點分的IP地址字串,這些IP都與我們要轉換的域名對應,那麼與該域名對應的IP有多少呢?該指標陣列時以NULL結尾的,我們可以通過這一標誌遍歷這個指標陣列得到所有的與該域名對應的IP地址字串。  

下面給出一端程式碼來說明如何使用該函式獲得IP地址,該程式碼是別人寫的,我只是稍微修改了一下用於測試以說明我上面給出的結論,該程式我已經在VS2005上測試通過,讀者可以自己試驗一下,同時要注意程式碼紅色標誌處是如何遍歷出IP的:

#include <winsock2.h> 
       #include <stdio.h> 
        #include <stdlib.h>

#define name "www.baidu.com"
void main() 

     
  WSADATA wsadata; 
  int n; 
  char hostname[256]; 
  hostent *phostent; 
  protoent *pprotoent; 
  struct sockaddr_in sa; 
  if(WSAStartup(MAKEWORD(1,1),&wsadata)!=0) 
  { 
     printf("wsastartup() failed!!\n"); 
     return; 
  } 
  //printf("--------------------------\n"); 
  //if(gethostname(hostname,sizeof(hostname))!=0) 
  //{ 
  //   printf("gethostbyname() error!!\n"); 
  //   return; 
  //} 
   memset(hostname,0,sizeof(hostname));
   sprintf(hostname,"%s",name);
  printf("local host name:%s\n",hostname); 
  printf("------------------\n"); 
  phostent=gethostbyname(hostname); 
  if(phostent==NULL) 
  { 
     printf("gethostbyname() error!!\n"); 
     return; 
  } 
  printf("name:%s\nalianses:%s\naddrtype:%d\nlength:%d\n",phostent->h_name,phostent->h_aliases,phostent->h_addrtype,phostent->h_length); 
  for(n=0;phostent->h_addr_list[n];n++) 
  { 
     memcpy(&sa.sin_addr.s_addr,phostent->h_addr_list[n],phostent->h_length); 
     printf("address:%s\n",inet_ntoa(sa.sin_addr)); 
  } 
  printf("--------------------\n"); 
  pprotoent=getprotobyname("tcp"); 
  if(pprotoent==NULL) 
  { 
     printf("getprotobyname() failed!!\n"); 
     return; 
  } 
  printf("name:%\nproto:%d\n",pprotoent->p_name,pprotoent->p_proto); 
  for(n=0;pprotoent->p_aliases[n];n++) 
  { 
     printf("aliases:%s\n",pprotoent->p_aliases[n]); 
  } 
  WSACleanup();

}         

【知識補充】

         在我們認識HTTP之前,有必要先弄清楚URL的組成,例如:

  1.http://:代表超文字傳輸協議,通知microsoft.com伺服器顯示Web頁,通常不用輸入;

  2.www:代表一個Web(全球資訊網)伺服器;

  3.Microsoft.com/:這是裝有網頁的伺服器的域名,或站點伺服器的名稱;

  4.China/:為該伺服器上的子目錄,就好像我們的資料夾;

  5.Index.htm:index.htm是資料夾中的一個HTML檔案(網頁)。


相關推薦

gethostbyname()成功可能原因

本文摘自:http://blog.163.com/[email protected]/blog/static/4243883720091025102830596/          gethostbyname()使用該函式可以將一個伺服器的域名轉化成該伺服器的I

成功便成仁

不成功便成仁!!!!!!!!!!!!!!決心書寫決心書,對我來書,是一個很嚴肅的事,因為我這人意誌一直不怎麽堅定,想以此來鞭策自己,監督自己。大家好,我叫程博,工作好幾年,工作很輕松,天天坐著,感覺要成仙,所以就來到老男孩,學一門技術,一招鮮吃遍天下,暢遊技術海洋,所以想從這五個月的學習中脫胎換骨,特做以下策

Thinkphp5 微信公眾號token驗證成功原因

個人博客 很多 host ech tmp bsp tps 浪費 信息 最近要啟動微信項目,上個月就開始了解微信的開發,這個月要啟動項目,配置微信公眾號信息一直失敗。為此,我甚至手工寫了微信提交過來的記錄,如: &timestamp=1510210523&n

JDK配置環境變量成功原因

jdk配置環境 導致 inf jdk安裝 jre 找到 頂部 配置 遇到的問題 根據自己配置環境變量遇到的問題進行總結: 1.二次安裝需要註意的問題 由於已經安裝了一次的原因,此時的註冊表已經有了安裝記錄。 建議刪除jdk的記錄 首先打開註冊表 開始菜單→運行。或者直接鍵盤

損失函式震盪收斂可能原因:tf.train.shuffle_batch

​ 在製作tfrecords資料集的時候,比如說將cifar資料轉換成tfrecords資料集,一般會用到tf.train.shuffle_batch函式,而損失函式震盪不收斂的原因就可能就是資料集製作出現問題。 ​ Cifar-10資料集包含了airlane、automobile、bi

關於Android studio debug成功原因

1.在Androidmainfest.xml檔案中,註釋掉 android:process=":remote" 2.檢視build.gradle檔案裡面的配置 buildTypes { debug { minifyEnabled false de

Navicat Premium連線伺服器資料庫成功原因

問題分析: 1.伺服器連線時IP地址填寫錯誤。 2.連線使用者名稱,密碼填寫錯誤。 3.未開啟mysql服務。 4.伺服器與個人計算機連線通路故障。 5.個人計算機本機IP地址與伺服器不在同一個網段(

iOS Plist檔案writeToFile寫入成功原因

writeToFile寫入不成功的原因 [cacheDic writeToFile:cacheURL atomically:YES]; 後卻返回no,查閱手冊發現: If an array or dictionary contains objects that are n

spring mvc 給Controller新增事務成功原因

掃描配置如下:spring-context.xml <context:component-scan base-package="com.freecg.green007">     <context:exclude-filter type="annotat

CentOS7修改主機名稱(hostname)總是成功原因及解決辦法

最近研究一個東西,參考別人的文章搭建一套大資料環境。文章寫的非常詳細也非常好,跟著文章一步步進行實踐,基本都沒有問題,但是到了最後一步進行試驗時,CentOS7總是報錯:INFO metrics.MetricsUtil:Unable to obtain hostName ja

setResult(RESULT_OK)成功原因

ActivityA 啟動Activity B。 A: activity.startActivityForResult(intent, requestCode) B: setResult(RESULT_OK); finish(); A:onActivityResult 發

Mysql登入中文名稱+密碼成功原因是資料庫編碼是utf8

登入使用者名稱:中文的情況下,登入後控制檯sql語句可以查詢成功,但是其實,資料庫編碼不是utf8 所有不行。嘗試英文的使用者名稱可以登入成功。 所以判斷是編碼問題。 解決: 資料安裝目錄下:我的在C:\Program Files (x86)\MySQL\MySQL Ser

antd-design TextArea initialValue 生效可能原因

rule script light mes div rip true 不生效 str <Form.Item label="展會介紹"> {getFieldDecorator(‘introduce‘, {

modelsim仿真正確FPGA運行正確的可能原因

仿真 warn bsp pga del 自己的 編譯器優化 綜合 log 困住整整一周了,工作進行不下去,中午偶遇導師,指導意見是有兩種可能: 1. FPGA編譯器優化代碼,可以考慮把綜合過程中所有的warning排查一下 2. verilog裏有不可綜合的語句。 又及

struts 找到action 的可能原因

strutsstruts版本2.5.13,配置如下<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Config

ie9安裝總提示成功是什麽原因

IE瀏覽器9出現錯誤我是WIN7 32位旗艦,不想使用系統自帶IE8,現升級安裝IE9,可是總提示安裝不了.按網上說的下載四個補丁,只安裝成功三個,kb2028551安裝提示不適合此計算機,查看已更新的補丁裏也沒有2028551,請問如何解決? ie9安裝總提示不成功是什麽原因

你還在猶豫辦辦理深戶嗎?12月深戶辦理窗口可能關閉

type 3年 分享圖片 技術 ext pre fff RoCE 提交 每年的12月份,辦理深戶的窗口都會暫時關閉,深圳政府會根據全年的申請情況重新制定政策,到了年後才會重新開放窗口。   所以現在符合條件的朋友,就趕緊整理好材料遞交吧,要不窗口關閉了就得等年後才能

IEnumerable 集合迴圈賦值會成功要改為 List 集合迴圈賦值

public static void Smo2(ref IEnumerable<AA> list) { foreach (var item in list) { Conso

#程式設計師離職的原因有哪些?最搞笑的原因:綠了CEO,敢呆了

現在的網際網路行業無疑是很熱門的一個行業,雖然辛苦,但是架不住薪資高啊,畢竟程式設計師也是向錢看的,那麼程式設計師靠什麼漲薪呢,跳槽是一個很實用的手段之一。但是程式設計師除了離職跳槽,還有哪些離職原因呢。 有想學習java的程式設計師,可來我們的java學習扣qun:72340,3928免費

託管除錯助手 "PInvokeStackImbalance":的呼叫導致堆疊對稱。原因可能是託管的 PInvoke 簽名與非託管的目標籤名匹配。請檢查 PInvoke 簽名的呼叫約定和引數與非託管

  在C#中一定要檢查引用時的資料型別 WinAPI 的資料型別 預設是32位的,但是引用時外部的是 Long型別預設是64位的。所以引用時需要將 long 改為 int 型。 參照 http://blog.sina.com.cn/s/blog_8248282d0101h