基于Winsock的主機域名查找程序?qū)崿F(xiàn)
第22卷第6期井岡山師范學(xué)院學(xué)報(自然科學(xué))VoL22No.62001年12月Jo岫1al0fJin鷦蛐伊h∞NomIalCollege(NaturalSciences)Dec.2001基于Winso
第22卷第6期井岡山師范學(xué)院學(xué)報(自然科學(xué))VoL22No.62001年12月Jo岫1al0fJin鷦蛐伊h∞NomIalCollege(NaturalSciences)Dec.2001
基于Winsock的主機域名查找程序?qū)崿F(xiàn)
譚云蘭
(井岡山師范學(xué)院計算機科學(xué)系,江西吉安343009)
摘要:闡述了Intemet主機域名的有關(guān)概念和相關(guān)問題,并給出開發(fā)基于Winsock網(wǎng)絡(luò)編程的通信原
理和機制,最后給出域名查找程序?qū)崿F(xiàn).
關(guān)鍵詞:域名;套接字;客戶/服務(wù)器
中圖分類號:TP316.8文獻標(biāo)識碼:A文章編號:1006-1975(2001)06?0035-05
Socket(套接字)最初是由加利福尼亞大學(xué)BERKLEY學(xué)院為UNIX操作系統(tǒng)開發(fā)的網(wǎng)絡(luò)通信接口,它只能用于UNIX操作系統(tǒng).但隨著Socket成功地移植到WINDOWS平臺下,WINDOWSSocket也就得到正式規(guī)范.目前,WINSOCK2的規(guī)范版本已發(fā)布.WINDOWSSocke£是基于WINDOWS平臺的TCP/IP協(xié)議編程接口.基于WINSOCK的動態(tài)鏈接庫為編程語言(VC++)提供了通信接口.
兩個相關(guān)名詞:
1)Intemet主機域名:主機域名由多個子域組成,中間用“.”分隔開來,域名的劃分采用類似樹型結(jié)構(gòu)的分層結(jié)構(gòu).每個域可進一步劃分為一些字域.最高域由Intemet網(wǎng)絡(luò)中心集中管理.主機名和IP地址問的映射主要是由DNS(DomainNameSystem)來完成.
2)Socket:中文又稱套接字.它其實是網(wǎng)絡(luò)中的一種進程間的通信機制.Socket是網(wǎng)絡(luò)通信的基本構(gòu)件.一個Socket對應(yīng)于通信的一端.網(wǎng)絡(luò)通信的Socket接口模型將通信主機或進程當(dāng)作端點.每個網(wǎng)絡(luò)通信對應(yīng)兩個端點:本地主機(或進程)和遠地主機(或進程).Socket接口將網(wǎng)絡(luò)通信的每個端點稱為一個Socket.Socket是可被命名和尋址的通信端點,一個正在被使用的Socket都有它的類型與其相關(guān)的進程.Socket接口定義了許多函數(shù)或例程,程序員可以調(diào)用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序.
1客戶/服務(wù)器模型
客戶/服務(wù)器是兩個應(yīng)用程序(進程),客戶向服務(wù)器發(fā)出服務(wù)請求,服務(wù)器作出響應(yīng),服務(wù)器通常在一個眾所周知的地址監(jiān)聽客戶對服務(wù)器的請求.也就是說,服務(wù)進程一直處于休眠狀態(tài),直到一個客戶程序提出了請求.此時,服務(wù)器被“驚醒”并為客戶提供相應(yīng)的服務(wù).
通信原理和機制:
基于TCP/IP協(xié)議的應(yīng)用程序的設(shè)計一般采用客戶/服務(wù)器模式.本文采用的是面向連接的通信機制,如圖1所示.圖1是一個面向連接的協(xié)議的套接字系統(tǒng).在實際應(yīng)用中,必須有客戶/服務(wù)器兩個進程,并且首先啟動服務(wù)器.本文的程序?qū)崿F(xiàn)是在VisualC++5.0環(huán)境下實現(xiàn)的.VC++封裝Winsock的函數(shù),在應(yīng)用程序中要包含“Winsock.h”頭文件.Winsock的動態(tài)連接庫為應(yīng)用程序提供更高層、更簡單的通信函數(shù).為保證每個Winsock正確應(yīng)用,在調(diào)用Winsock動態(tài)連接庫的函數(shù)中,要調(diào)用WSAStartup()函數(shù)(為每個調(diào)用者提供特定的數(shù)據(jù)結(jié)構(gòu),預(yù)留系統(tǒng)資源)和WSACleanup()函數(shù)(釋放為特定應(yīng)用預(yù)留的系統(tǒng)資源).基于客戶/服務(wù)器的程序,要調(diào)用解析器庫中的函數(shù)與DNS服務(wù)器聯(lián)系.解析器函數(shù)如gethostbyname()和gethostbyaddr(),前者是見主機名映射為IP地址,后者執(zhí)行相反的映射.
收稿日期:2001—04一16:修回日期:2001.10—20.作者簡介:譚云蘭(1972,),女,江西新干人,助教,研究方向:計算機網(wǎng)絡(luò)與通信
萬 方數(shù)據(jù)
,井岡山師范學(xué)院學(xué)報JOURNAL0FJlNGGANGSHANNORMALCOU上GE第22卷
圖1面向連接的套接字系統(tǒng)調(diào)用時序圖
2程序?qū)崿F(xiàn)及代碼
∥client.cpp
∥編譯后執(zhí)行文件為client.exe
∥說明:本程序由server和client構(gòu)成,由client發(fā)送一個待查域名到server∥由server通過gethostbyname()函數(shù)查得IP地址并返回給client∥server應(yīng)先于client運行
∥使用格式:client域名服務(wù)器IP地址待查域名
∥如找到IP地址則打?。桑械刂?,如未找到則打印“Don,tfindIPaddress”銜nclude“windows.h”
{ff_include“winsock.h”
撐include<stdio.h>
#include<conio.h>
社include<stdlib.h>
#include<string.h>
constVERSION—MATOR=2;
constVERSION_MINOR=0;
voidShowUsage(void)
∥輸入?yún)?shù)錯,打印命令執(zhí)行格式.
{printf(“usage:clientDNs—seⅣerIPDomainName\11”);
exit(1);}
intmain(inta唱c,char爿:argV[])
{wSADATAwSData;∥調(diào)用winsock所需的一個臨時參數(shù)
LPHOSTENTlpHostEntry;∥存放找到的主機信息
LPSTRszIPAddress;∥存放轉(zhuǎn)換成點分制的主機IP地址
萬 方數(shù)據(jù)
,第6期譚云蘭:基于Wjnsock的主機域名查找程序?qū)崿F(xiàn)
charstrLocalhost[100];
intsockid,nConnenct;
SOCKADDRjNsockSeAddr;
if(argc!=3)Showusage();∥使用輸入?yún)?shù)不對,顯示出錯信息并退出
if(WSAStartup(MAKEWORD(VERSION—MATOR,VERSION—M】NOR),&WSData))
∥初始化winsock的使用,如找不到wS2_32.DLL則退出
{printf(“CannotfindWinsock.\n”;
exit(1);}
gethostname(strLocalhost,100);∥查找本地主機名
printf(“I.DcalHostName:%s\n",stllLocalhost);
lpHostEntry=gethostbyname(strLocalhost);∥查找本地主機IP
if(1pHostEntry=NULL)
printf(“unabletofindhost:%s.h”,argv[1]);∥找不到
else{szIPAddress=inet—ntoa(術(shù)(LPIT、LADDR)木(IpHostEntIy一>h—adddist));printf(“LDcalHostIPAddress:%s\n”,szIPAddress);
∥找到主機,將其轉(zhuǎn)換為十進制點分制形式,并打印出來}
if(sockid=socket(AF—INET,SOCK—STREAM,O)<O)
{printf(“ErrorinSOCKET()\Il”);
exit(1);
}∥建立Socket
sockSeAddr.sinj.amily=AF—INET;
sockSeAddr.sin—port=1200;
sockSeAddr.sin—addr=術(shù)(LPIN—ADDR)ineLaddr(argv[1]);
nConnect=connect(soekid,(LPSOCKADDR)&sockSeAddr,sizeof(sockSeAddr),;if(nConnect<O)
{printf(“EⅡorinCONNECT()\n”);
exit(1);
}∥和域名服務(wù)器建立連接
send(sockid,a唱v[2],strlen(argv[2],0);∥發(fā)送待查域名到域名服務(wù)器
recv(sockid,buf,100,O);∥接收服務(wù)器返回的IP地址
p訂ntf(“IPaddressis:\n%s”,buf);”∥打印出IP地址
wSAcleanup();∥中止ws2—32.DLL的使用.
return(0);
}7
∥server?cpp
∥編譯后執(zhí)行文件為senrer.exe
∥說明:本程序由server和client構(gòu)成,由client發(fā)送一個待查域名到server
∥由server通過gethostbyname()函數(shù)查得IP地址并返回給client
∥server應(yīng)先于client運行
∥如找到IP地址則直接返回,如未找到則返回“Don7tfindIPaddress”
∥使用格式:server
constVERSl0N—MATOR=2;
constVERSION—MINOR=O;
萬 方數(shù)據(jù)37
,井岡山師范學(xué)院學(xué)報JOURNAL0FJINGGANGSHANNORMALCOU正GE
voidsearchdns(intsockid);
intmain(intargc,char水越g、,)[])
{wSADA7I’AwSData;∥調(diào)用winsock所需的一個臨時參數(shù)
LPHOSTENTlpHostEn田;∥存放找到的主機信息
LPSTRszIPAddre踮;∥存放轉(zhuǎn)換成點分制的主機IP地址
charstr【ocalhost[100];
intsockid,奉nConnect,半nC;
SOCKADDRjNsockSeAddr;
I.jPSOCKADDRsockCLAddr:
If(WSAStartup(MAKEWORD(VERSION-JⅥA’IIoR,VERSIONJⅥINOR),&礴蛋Da£a))
∥初始化winsock的使用,如找不到wst32.DLL則退出
{printf(“CannotfindWinsock.、ll”);
retum(1);}
gethostname(str】L0calhost,100);
一ntf(“LocalHost№me:%s、rI”,strkcalhost);
lpHostEntry=gethostbyn踟e(strLocalhost);∥查找主機
if(1pHostEntry=NULL)
printf(“unabletofindhost:%s\n”,arg、,[1];∥找不到
else{szIPAddl.ess=inet-ntoa(術(shù)(LPIN-ADDR)水(1pHostEntry一>h_addr-list));
printf(“LocalHostIPAddress:%s\n”,szIPAddress);
∥找到主機,將其轉(zhuǎn)換為十進制點分制形式,并打印出來}
if(sockid=socket(AF—INET,SOCK—SlTREAM,O)<O)
{printf(“En.orinSOCKET()\rI”);
retum(1);
}∥建立Socket
sockSeAddr.sinjamily=AF_INET;
sockSeAddr.sin—port=1200;
sockSeAddr.sin—addr=宰(LPIN—ADDR)木lpHostEntry一>h—addr_list;
if(bind(sockid,(LPSOCKADDR)&sockSeAddr,sizeof(sockSeAddr))<0)
{printf(“En.orinBIND()”\n);
retul.n(1);
}
listen(sockid,5);∥等待新的連接請求
while(1){
if((nConnect=accept(sockid,sockCIAddr,nC))<0)∥等待新的連接請求
{printf(“EⅡorinACCEIynn”);
break;}
-beginthread(searchdns,0,nConnect);∥建立一個線程處理新的連接}
wsACleanup();∥中止ws2—32.DLL的使用.
voidsearchdns(void:I;sockid)
{Inti;
萬 方數(shù)據(jù)第22卷return(0);
,第6期譚云蘭:基于Winsock的主機域名查找程序?qū)崿F(xiàn)
char
charbuf[100];nofind[]=“Don,tfindIPaddI_es8’:
LPHOSTENTlpHostEntry;
LPSTRszIPAddress:
id=(int)珠sockid;
recv(sockid,buf,100,0)<=0)∥接收client的請求
if((1pHostEntry=gethostbyname(buf))=NULL)
send(id,nofind,strlen(n06nd));∥沒有找到IP地址
else
{szIPAddress=ineLntoa(:l:(LPIN二ADDR)木(1pHostEntry一>h—addUist));
send(id,szIPAddress,strlen(szIPAddress),O)}
closesocket(id);
-endthread();∥關(guān)閉連接并結(jié)束線程
r.etum:
)
3結(jié)論與展望
本文給出了基于WINSOCK網(wǎng)絡(luò)編程的一般的開發(fā)方法,并給出IN’IERNET上的域名查找程序?qū)崿F(xiàn)的應(yīng)用.本文所給出的程序只能實現(xiàn)英文域名的查找,而對于中文域名的查找卻沒有涉及,因為中文域名的查找要涉及到漢字的內(nèi)碼,有待本人的進一步思考.
參考文獻:
[1]蔣東興等.Windowssocket網(wǎng)絡(luò)程序設(shè)計大全[M).北京:清華大學(xué)出版社,1998.17~18.
[2]谷保山.VisualC++5.O編程與實例[M].北京:科學(xué)出版社,1998.285~289.
[3]DOUGIDSEComer.用CP/IP進行網(wǎng)際互連(第一卷):原理、協(xié)議和體系結(jié)構(gòu)[M].第3版.林瑤,蔣慧,杜蔚,等譯.北京:電
子工、Ik出版社,1998.293~294.
Theprogramdesignofhostdomainnamequerybased
TANYun—lanonWi璐ock
(Computer“DepartmentofJinggangshanNormalCoUege,Ji7an343009,China)
Abstract:
Domain
last,theNameisInthispaper,basicconceptsandcoH℃latedissueofcommunicationprogrammingtechnologybasedonbasedonIntemetHostdiscussed,ThecommunicationMechanism“NetworkWinscokisintroduced.AtpmgramcodefbrDomainnamequeryisdesigned.
Keywords:domainname;socket,client/server
萬方數(shù)據(jù)
,基于Winsock的主機域名查找程序?qū)崿F(xiàn)
作者:
作者單位:
刊名:
英文刊名:
年,卷(期):譚云蘭井岡山師范學(xué)院計算機科學(xué)系,江西,吉安,343009井岡山師范學(xué)院學(xué)報JOURNAL OF JINGGANGSHAN NORMAL COLLEGE2001,22(6)
參考文獻(3條)
1. 蔣東興 Windows socket網(wǎng)絡(luò)程序設(shè)計大全 1998
2. 谷保山 Visual C 5.0編程與實例 1998
3. DOUGLOS E Comer. 林瑤. 蔣慧. 杜蔚 用CP/IP進行網(wǎng)際互連.(第1卷):原理、協(xié)議和體系結(jié)構(gòu).第3版 1998
本文鏈接:http://d.g.wanfangdata.com.cn/Periodical_jgssfxyxb200106012.aspx