2010-07-25 73 views
0

我沒有得到有關查找機器IP地址的任務。我需要幫助理解這段代碼的邏輯。我們的大學實驗室使用代理服務此代碼是否可以在沒有代理的計算機上工作?需要幫助瞭解C程序,找到機器IP地址

 #include <stdio.h>   /* stderr, stdout */ 
     #include <netdb.h>   /* hostent struct, gethostbyname() */ 
     #include <arpa/inet.h>  /* inet_ntoa() to format IP address */ 
     #include <netinet/in.h>  /* in_addr structure */ 

     int main(int argc, char **argv) { 
     struct hostent *host;  /* host information */ 
     struct in_addr h_addr; /* internet address */ 
     if (argc != 2) { 
      fprintf(stderr, "USAGE: nslookup <inet_address>\n"); 
      exit(1); 
     } 
     if ((host = gethostbyname(argv[1])) == NULL) { 
      fprintf(stderr, "(mini) nslookup failed on '%s'\n", argv[1]); 
      exit(1); 
     } 
     h_addr.s_addr = *((unsigned long *) host->h_addr_list[0]); 
     fprintf(stdout, "%s\n", inet_ntoa(h_addr)); 
     exit(0); 
     } 
+1

你讀過正在使用的函數的manpages嗎?那之後你不瞭解什麼部分? – Thomas 2010-07-25 17:46:42

回答

2

這裏關注的兩個關鍵方法是:

  1. gethostbyname() - gethostbyname函數獲取主機信息
  2. inet_ntoa - 轉換IP地址添加到IN_ADDR

儘量具體,您在哪裏瞭解代碼的問題。

該代碼適用於我。

$./a.out nslookup 

返回主機IP。

+2

+1連接Beej。 – 2010-07-25 17:48:10

+0

未得到指針變量*主機和條件在if()中進行測試 – 2010-07-25 18:13:55

0

實際上,gethostbyname函數執行返回hostent結構域的DNS請求。 例如,你可以用wireshark來嗅探網絡,看看流量是什麼樣子。

1

netdb.h - 定義爲網絡數據庫操作 arpa/inet.h - 定義互聯網業務 netinet/in.h - 互聯網地址族 的gethostname()函數返回當前機器的標準主機名。 inet_ntoa(h_addr)將IP地址從32位網絡格式轉換回點分十進制。

這些是基本的理解術語。細節最重要的是使用google