卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

基于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

標(biāo)簽: