1. 程式人生 > >C語言之網路程式設計(一)域名解析

C語言之網路程式設計(一)域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。

提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域名,在開始正常的通訊前必須把域名轉換為IP地址。這個域名到IP地址的轉換過程稱為域名解析。

用域名取得主機的IP地址

用域名取得主機的IP地址:域名是為了便於記憶,來代替IP地址訪問網路的方法。在使用域名訪問網路時,需要將這個域名轉換成相對應的IP地址。用域名返回地址的函式是gethostbyname。這個函式的使用方法如下所示。
01struct hostent *gethostbyname(const char *name);
在引數列表中,name是一個表示域名的字串。函式會把這個域名轉換成一個主機地址結構體返回。結構體hostent的定義方法如下所示。
01struct hostent 
02{
03  char  *h_name;
04  char **h_aliases;
05  int    h_addrtype;
06  int    h_length; 
07  char **h_addr_list;
08}

這個結構體成員含義如下所示。

h_name:正式的主機名稱。
h_aliases:這個主機的別名。
h_addrtype:主機名的型別。
h_length:地址的長度。
addr_list:從域名伺服器取得的主機的地址。
在解析域名時,可能沒有這個域名或域名伺服器發生錯誤。可能返回的錯誤資訊如下所示。可以用error來捕獲錯誤編號。
HOST_NOT_FOUND:主機沒有找到。
NO_ADDRESS or NO_DATA:沒有IP地址或沒有資料。
NO_RECOVERY:域名伺服器發生錯誤。
TRY_AGAIN:請稍候再重試。

DEMO:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>

#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc,char **argv)
{
	extern int h_errno;
	struct hostent *h;
	struct in_addr in;
	struct sockaddr_in addr_in;
	h=gethostbyname("xxx.xxx.com");
	if(h==NULL)
	{
		printf("%s\n",hstrerror(h_errno));
	}
	else
	{
		memcpy(&addr_in.sin_addr.s_addr,h->h_addr,4);
		in.s_addr=addr_in.sin_addr.s_addr;
		printf("host name:%s\n",h->h_name);
		printf("ip lenght:%d\n",h->h_length);//IPv4 or IPv6
		printf("type:%d\n",h->h_addrtype);
		printf("ip:%s\n",inet_ntoa(in));//將一個IP轉換成一個網際網路標準點分格式的字串

	}
	return 0;
}

用IP地址返回域名

用IP地址返回域名:用一個IP地址可以查詢到這個IP的域名,需要使用的函式是gethostbyaddr。這個函式的使用方法如下所示。

01struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
在引數列表中,addr是一個儲存了IP地址的字串。len是這個IP地址的長度。type的值一般為AF_INET。函式的返回值是hostent型別的指標。這一指標的定義和上一節的相同。如果轉換失敗,則返回null指標。下面的例項,是用gethostbyaddr函式查詢一個IP所對應的域名。其中使用的IP地址是央視國際的網站。

提示:把IP地址轉換為域名的過程稱為反向域名解析。

相關推薦

C語言網路程式設計域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。 提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域

C語言網路程式設計伺服器和客戶端

1、 套接字:源IP地址和目的IP地址以及源埠號和目的埠號的組合稱為套接字。其用於標識客戶端請求的伺服器和服務。 常用的TCP/IP協議的3種套接字型別如下所示。 (1)流套接字(SOCK_STREAM): 流套接字用於提供面向連線、可靠的資料傳輸服務。該服務將保證資料能夠實現無差錯、無重複傳送,並按順序接

C語言面向物件程式設計:封裝與繼承

最近在用 C 做專案,之前用慣了 C++ ,轉回頭來用C 還真有點不適應。 C++ 語言中自帶面向物件支援,如封裝、繼承、多型等面向物件的基本特徵。 C 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 C 語言本身已有的特性來實現面向物件的一些基本特徵。接下來

Python C/S 網路程式設計 三種方法實現天氣預報小程式

1. 首先明白下協議棧和庫的概念: 協議棧(Protocol Stack): 是指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。 庫(Library):主要用來解析要使用的網路通訊協議,包含Python內建標準庫

程式設計菜鳥到大佬路:C語言程式特別篇

程式設計習題 迴圈例題選講 例1.乘方計算 給出一個整數a和一個正整數n,求乘方ana^nan。 輸入:一行,包含兩個整數a和n。 -1000000 <= a <= 1000000,1 <= n <= 10000。 輸出:一個整數,

UNIX網路程式設計一個簡易的TCP C/S模型(echo sever)

以下內容主要參考書籍《Linux C程式設計一站式學習》、《Unix網路程式設計》、《Unix高階環境程式設計》 首先要明確客戶端與伺服器要怎麼去實現通訊 下圖便是一個簡易的TCP C/S模型實現 知道模型之後,接下來只是一些與網路介面相關的API呼叫

C++網路程式設計gRPC的編譯

Google是真滴煩,整個編譯鏈全是自家產品,在編譯之前先來安裝一堆東西 安裝環境依賴 chocolatey Windows下的

JavaHTTP網路程式設計:TCP/SSL網頁下載

目錄 一、簡介:HTTP程式設計     1、HTTP系統設計     2、HTTP客戶端工作過程     3、HTTP服務端工作過程 二、基於TCP Socket的HTTP網頁下載 三、基於SSL Socke

C語言代碼訓練

color tro 題型 blank adding bsp 喜歡 add 方便 今天我們先來講解一道C語言的經典例題,也是從零開始系列中的一道課後練習題。 請用控制臺程序繪制如下圖案。 循環經典例題 分析情況 這個題目是要求打印30行"*",每行打印的個數不同。通過這

C#系列基礎知識點

命名規則 系列 字符 註釋 編輯器 小數類型 智能 規則 解釋 知識點一:VS啟動方法 第一種:雙擊圖標 第二種:window+R——調出cmd,輸入devenu properties 屬性的意思 知識點二:後綴名解釋 .sln 解決方案文件:包含整個解決方案的信息 .

C語言基礎複習筆記指標

最近linux很火,年前對linux再詳細瞭解了個大概,結合在windows平臺活躍與強大無比的C++,最終得出一個結論:C語言依然強大。 過年回來,便對的C語言充滿了興趣,於是乎去網上下載了教程回來,細細研讀,基礎程式設計思想始終是很重要的。 首先,入手的便是C語言的核心精華部分,指標。要

python學習-網路程式設計

udp的接收和傳送資料程式碼: udp的傳送資料程式碼如下: import socket def main():     #建立套接字     udp_socket = socket.socket(socket.AF_I

網路程式設計:埠那些事兒

TCP和UDP協議都存在一個叫做埠的東西,但埠卻不是IP協議的一部分。 埠被設計出來主要是為了給協議棧和應用對應: 協議棧用埠號將資料分配給不同的應用層程式 應用層程式用埠號去區分不同的連線,參見之前提到過的“四元組” TCP和UDP協議都使用了埠號(Port num

Python Socket網路程式設計初識Socket和Socket初步使用

目錄 前言 網路程式設計 實質 IP地址和埠 資料傳輸協議 協議 Socket

Socket網路程式設計

此文使用的協議是 TCP       首先要寫入以下程式碼,不然很多函式都用不了 #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib")   ●伺服器端    

Linux學習網路程式設計select

言之者無罪,聞之者足以戒。 - “詩序” 1、阻塞式I/O 下面看一下實現的邏輯: 2、非阻塞式I/O 下面看一下實現的邏輯: 3、I/O複用(select/epoll) (1)  int  select (int maxfdp, fd_set

C語言指標筆記1

指標(pointer)是C語言中最重要的概念之一,用於儲存變數的地址。 1.&運算子 (1)一元&運算子可給出變數的儲存地址。如過pooh是變數名,那麼&pooh是變數地址。 (2)如下例所示,使用運算子檢視不同函式中的同名變數儲存在什麼位置。 原始碼: //檢視

運維經典面試題網路

1、寫出12.23.34.0/29的掩碼 11111111.11111111.11111111.11111000 255.255.255.248 2、簡述衝突域與廣播域的區別 衝突域:基於osi的第一層物理層。 一個站點向另一個站

Windows網路程式設計:TCP/IP協議

概述 這個協議是一個四層協議: 應用層,主要協議有HTTP、FTP等 傳輸層,主要協議有TCP、UDP等 網路層,主要協議有IP等 鏈路層,主要協議有ICMP等 下層中的協議總是為上層中的協議服務的,比如說應用層的HTTP、FTP協議都是基於T

c語言指標進階

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址