1. 程式人生 > >Linux 網路程式設計之通過IP或者主機名獲取資訊

Linux 網路程式設計之通過IP或者主機名獲取資訊

struct hostent
{
char *h_name; /* 主機的正式名稱*/
char **h_aliases; /* 主機的別名列表*/
int h_addrtype; /* 主機的地址型別AF_INET */
int h_length; /* 主機的地址長度*/
char **h_addr_list; /* 主機的IP地址列表*/
}
#define h_addr h_addr_list[0] /* 主機的第一個IP地址*/

struct hostent *gethostbyname(const char *name);
通過主機名 name 獲取 主機IP等資訊。成功返回給定主機名包含的主機名字和地址資訊的 hostent結構體指標。


示例如下:

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

int main(int argc, char *argv[])
{
	if(argc != 2)
	{
		printf("Usage: %s domain_name \n",argv[0]);
		exit(EXIT_FAILURE);
	}

	struct hostent *ht = gethostbyname(argv[1]);
	if( ht )
	{
		int i = 0;
		printf("Source domain: %s \n", argv[1]);
		printf("Formal domain: %s \n", ht->h_name);
		printf("Address type: %s \n", \
				ht->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6" );
		printf("Address length:%d \n", ht->h_length);

		for( ; ; ++i)
		{
			if (ht->h_aliases[i])
				printf("Aliases name %d : %s \n",i+1 ,ht->h_aliases[i]);
			else
				break;
		}

		for(i=0; ; ++i)
		{
			if (ht->h_addr_list[i])
				printf("IP Address %d : %s \n",i+1, \
						inet_ntoa((unsigned int *)ht->h_addr_list[i]));
			else
				break;
		}

	}

	return 0;
}

struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
 返回對應於給定地址的包含主機名字和地址資訊的hostent結構指標。
 addr 指向網路位元組序地址的指標。
 len 地址的長度。
 type 地址型別。

示例如下:

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

#define ADDR_LEN 	4
#define ADDR_TYPE	AF_INET

int main(int argc, char *argv[])
{
	if (argc != 2)
	{
		printf("Usage: %s IP Address\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	
	struct in_addr *addr = (struct in_addr *)malloc(sizeof(struct in_addr));
	if ( ! inet_aton(argv[1], addr))
	{
		printf(" %s Invalid address",argv[1]);
		exit(EXIT_FAILURE);
	}

	struct hostent *ht = gethostbyaddr(addr, ADDR_LEN, ADDR_TYPE);

	if(ht)
	{
		int i = 0;
		printf("Source IP: %s\n",argv[1]);
		printf("Formal domain: %s \n",ht->h_name);
		printf("Address type: %s\n",ht->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6");
		printf("Address length: %d \n", ht->h_length);
		
		for( ; ; ++i)
		{
			if(ht->h_aliases[i])
				printf("Aliases name %d : %s\n",i+1,ht->h_aliases[i]);
			else
				break;
		}

		for(i = 0; ; ++i)
		{
			if(ht->h_addr_list[i])
				printf("IP Address %d : %s\n",i+1, \
						inet_ntoa((unsigned int *)ht->h_addr_list[i]));
			else
				break;
		}
	}
	else
	{
		switch(h_errno)
		{
			case HOST_NOT_FOUND :
				printf("The specified host is unknown\n");
				break;

			case NO_ADDRESS:
				printf("The requested name is valid but does not have an IP address.\n");
				break;

			case NO_RECOVERY:
				printf(" A nonrecoverable name server error occurred.\n");
				break;

			case TRY_AGAIN:
				printf("A temporary error occurred in the authoritative \
						domain name server. Please try again later.\n");
				break;
		}
	}

	
	return 0;
}

gethostbyname()和gethostbyaddr()函式功能返回的HOSTENT的結構或NULL指標。
如果出現錯誤。h_errno的變數儲存的錯誤號。 
錯誤的可變h_errno的可以具有以下值: 
HOST_NOT_FOUND 
指定的主機是未知的。 
NO_ADDRESS或NO_DATA 
請求的名稱是有效的,但沒有一個IP地址。 
NO_RECOVERY 
不可恢復的名稱伺服器發生錯誤。 
TRY_AGAIN 
一個臨時錯誤發生在權威域名伺服器。請稍後再試。
 

相關推薦

Linux 網路程式設計通過IP或者主機獲取資訊

struct hostent { char *h_name; /* 主機的正式名稱*/ char **h_aliases; /* 主機的別名列表*/ int h_addrtype; /* 主機的地址型

linux網路程式設計TCP/IP基礎(二):利用ARP和ICMP協議解釋ping命令

一、MTU 乙太網和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作最大傳輸單元(MTU,Maximum Transmission Unit)。如果I

linux網路程式設計套接字(套介面)、ip、埠理解

它是網路通訊過程中端點的抽象表示,包含進行網路通訊必需的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。或者說,套接字,是支援TCP/IP的網路通訊的基本操作單元,可以看做是不同主機之間的程序進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中

linux網路程式設計socket(十六):通過UNIX域套接字傳遞描述符和 sendmsg/recvmsg 函式

void send_fd(int sock_fd, int send_fd) {     int ret;     struct msghdr msg;     struct cmsghdr *p_cmsg;     struct iovec vec;     char cmsgbuf[CMSG_SPACE(

linux 網路程式設計廣播

linux 網路程式設計之廣播 轉載:https://blog.csdn.net/qdlovecsj/article/details/8805483 廣播方式主要是指使用UDP套介面傳送資料,傳送資料的目標地址不是普通的地址,而是所指定網路的廣播地址。 什麼是廣播地址?是指IP地

Linux網路程式設計TCP程式設計

直接上程式碼如下所示: 1、標頭檔案定義 #ifndef __HEAD_NET_H__ #define __HEAD_NET_H__ #include <stdio.h> #include <string.h> #include <stdlib.h>

Linux網路程式設計IO模型

本文基於IO訪問中存在的兩個階段詳細介紹了Linux產生的五種IO模型。 上篇文章回顧: 小米開源監控Open-Falcon收錄汽車之家貢獻的Win版Agent 同步與非同步 同步是指一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後

洞悉C++網路程式設計tcp/ip和socket api

原文地址:https://blog.csdn.net/libaineu2004/article/details/79020403 TCP(Transmission Control Protocol) 傳輸控制協議 三次握手 TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次

linux網路程式設計多程序併發伺服器

1)使用多程序併發伺服器考慮的因素:       (1)父程序描述最大檔案描述符的個數(父程序需要關閉accept返回的新檔案描述符)       (2)系統內可建立程序的個數(與記憶體大小相關)       (3)程序建立過多是否降低整體服務效能 2)多程序建立併發

linux網路程式設計TCP狀態轉換及埠複用

(1)TCP狀態轉換圖               其中圖中分為三種狀態:實線代表的主動發起連線,虛線代表的被動發起連線,細實線代表的可以雙向發起連線的狀態。 主動發起連線方狀態變化:1)主動發起連線的一方傳送SYN標誌位,進入SYN_SENT狀態,等待接收被髮起連線方

Linux網路程式設計高階併發伺服器(轉)

1. 介紹 在上一節,我們介紹了Linux簡單的併發伺服器,通過在伺服器端建立多個子程序,來接收客戶端的請求,實現併發處理,但這種方式明顯有缺陷,伺服器並不知道客戶端請求的數量,所以事先建立的程序數不好確定。所以,這裡介紹三種高階併發伺服器模式。第一種是伺服器端統一

linux網路程式設計TCP介面詳解

socket int socket(int domain, int type, intprotocol);     監聽套接字描述符由socket建立,隨後用作bind和listen的第一個引數。一個伺服器通常僅建立一個監聽套接字,他在該伺服器的生命週期內一直存在。 c

linux網路程式設計用socket實現簡單客戶端和服務端的通訊(基於TCP)

一、介紹基於TCP協議通過socket實現網路程式設計常用API 1、讀者如果不是很熟悉,可以先看我之前寫的幾篇部落格,有socket,地址結構的理解,更加方便讀者理解 地址分別是: 2、socket(TCP)程式設計API簡介 1)、socket int s

linux網路程式設計RTP協議

以下內容取自: 本機通訊:https://www.cnblogs.com/lidabo/p/4160138.html(RTP協議傳輸)https://www.cnblogs.com/lidabo/p/4160145.html(RTP協議傳輸) 非本機:http://velep.com/arc

linux網路程式設計用socket實現簡單客戶端和服務端的通訊(基於UDP)

1、sendto和recvfrom函式介紹 sendto(經socket傳送資料) 相關函式 send , sendmsg,recv , recvfrom , socket 表頭檔案 #include < sys/types.h >#includ

Linux網路程式設計 大小端初探

    首先解釋一下大小端的概念。    大端(Big Endian),同時也是網路序,是資料在網路上傳輸的一種資料組織格式,其儲存的方式比較符合人們讀寫的習慣。    小端(Little Endian

linux網路程式設計伺服器

基於tcp協議的網路程式 1.所用函式: socket函式 socket()開啟一個網路埠,如果成功,就像open()一樣返回一個檔案描述符,應用程式可以像讀寫檔案一樣用read/write在網路上首發資料,如果調用出錯返回-1 bind函式:

Linux網路程式設計高階併發伺服器

在上一節,我們介紹了Linux簡單的併發伺服器,通過在伺服器端建立多個子程序,來接收客戶端的請求,實現併發處理,但這種方式明顯有缺陷,伺服器並不知道客戶端請求的數量,所以事先建立的程序數不好確定。所以,這裡介紹三種高階併發伺服器模式。第一種是伺服器端統一accept,接收

Linux網路程式設計IPv6

1.IPv6特點 我們已經學習過了流式套接字(SOCK_STREAM),資料報套接字(SOCK_DGRAM)和原始套接字(SOCK_RAWM),其中原始套接字的功能十分強大,能夠傳送自定義的資料包,偵聽網路上的資料,拒絕服務攻擊,傳送ICMP包等等。但這些協議都是基於IPv4,接下來,我們學習

Linux網路程式設計SYN洪水攻擊

1.概述 TCP建立連線需要3次握手,從IP層來看,客戶端傳送SYN請求,伺服器對SYN響應,而客戶端對伺服器的響應再次確認才能建立連線。在伺服器響應之後,等待一段時間,才能獲得客戶端的確認.從伺服器接收到客戶端的確認之前,伺服器的資源一直佔用。如果這時客戶端不確認,那麼這些連線就是半連線。通過