首页 > 作文

拨号服务器

更新时间:2023-03-03 04:31:35 阅读: 评论:0

滚珠风扇-提升管理能力

拨号服务器
2023年3月3日发(作者:土豆泥拌莜面)

控制远程计算机拨号上网并获取其IP地址

一、问题的提出

许多计算机系统需要7×24小时稳定可靠运行,当出现突发事件时,要求能对系

实施远程系统维护以便排除故障,此时就需要本地计算机和远程系统建立通信连

接,通过相应的工具软件实施远程维护。在建立远程通信连接时,通常采用Modem

拨号方法将远端Modem置为自动应答方式,由本地Modem通过公用电话网发起呼

来建立通信连接。当主、被叫Modem所在地之间的长途费率较高时,经常的远程

维护将带来较高的长途话费开支。本文提出通过Internet建立两台计算机之间

通信的方法。

二、通知远程计算机拨号上网

远程计算机安装Win98操作系统,在安装了拨号网络服务器组件后,便可配置为

一台拨号网络服务器,供本地计算机通过电话网拨号建立通信连接,并访问远程

计算机上的共享资源。在拨号通信链路上可绑定TCP/IP等通信协议,Win98拨号

服务器给每个拨入计算机分配一个独立的IP地址,同时也给自身分配一个IP地

址,

这些IP地址具有相同的网络编号,同属于一个通信子网,服务器的主机编号为1,

拨入计算机的主机编号依次从2开始编起。另外,Win98拨号服务器还提供了密

保护功能,拨入计算机只有在提供正确的密码情况下,才能成功建立起拨号连接。

当本地计算机要通知远程计算机拨号登录Internet时,首先通过电话拨号和远

计算机建立拨号连接,获取远程计算机分配给本机的IP地址,并经处理得到远程

算机的IP地址,然后,和远程计算机建立TCP/IP连接,并送出命令通知远程计算

准备断开拨号连接,登录Internet,当本地计算机收到远程计算机确认信息后,

便可

中断和远程计算机的拨号连接,也准备登录Internet。

三、获取远程计算机InternetIP地址

在取得远程计算机InternetIP地址前,本地计算机是无法通过Internet和远程

计算机进行实时通信的。远程计算机登录Internet,获取动态IP地址后,可通过

发电子邮件方式将动态IP地址通知本地计算机,也可通过将动态IP地址保存在

程、本地计算机都可访问到的FTP服务器文件中,供本地计算机读取。本文采用

一种方法,若没有合适的FTP服务器,可到提供免费主页空间允许以FTP方式维护

的Web站点上申请一块空间,供远程、本地计算机共同访问。

本地计算机登录Internet后,用FTP协议读取指定FTP服务器上含有远程计算机

态IP地址的文本文件,从而取得远程计算机的InternetIP地址,然后,本地计算

机便可通过Internet和远程计算机启动任何基于TCP/IP连接的通信应用程序,

利用Pcanywhere控制远程计算机,并可通过远程计算机访问与远程计算机相连

整个网络资源,达到对远程计算机系统进行维护的目的。

四、通知远程计算机断开Internet连接

当本地计算机和远程计算机通信结束后,便可通知远程计算机断开Internet连

接。

利用远程计算机的InternetIP地址,本地计算机和远程计算机建立TCP/IP连接,

出断开Internet指令,远程计算机收到指令后,回送确认消息,断开Internet连

接,

等待下一个命令的到来。

五、程序实现

本地、远程计算机运行的是同一道程序,通过不同的命令按钮来激活本地、远程

计算机程序所具有的不同功能。程序采用VC++6.0编写,在Win98环境下调试运

通过。限于篇幅,下面只给出程序的主要部分及注释说明,并省去了一些出错处理

环节。

//宏定义

#defineMAX_PENDING_CONNECTS2

#defineNO_FLAGS_SET0

#defineMY_MSG_LENGTH100

//全局变量

HRASCONNhCon;//RAS连接句柄

HWNDhWin;

HINSTANCEhInst;

DWORDThreadId=0;

HANDLEhThread=NULL;

charcRemoteIP[50];//remoteIP地址

SOCKETrv_sock,rsock;//服务端

//建立拨号连接函数,成功返回TRUEelFALSE

//szEntry拨号连接名szPhone电话号码szUr和szPassword分别为

internet的用户名和口令

BOOLStartCon(HWNDhWnd,char*szEntry,char*szUr,char*

szPassword,char*szPhone)

{

RASDIALPARAMSrdParams;

DWORDdwRet;

charszBuf[300];

=sizeof(RASDIALPARAMS);

lstrcpy(yName,szEntry);

strcpy(eNumber,szPhone);

backNumber[0]=‘0';

strcpy(Name,szUr);

strcpy(word,szPassword);

in[0]=‘0';

//以下开始同步拨叫网络

dwRet=RasDial(NULL,NULL,&rdParams,0L,NULL,&hCon);

returnTRUE;

}

//通过FTP协议读写FTP服务器上文件的函数cFlag=0写=1读,读写成功时

返回所读写的字节数

DWORDFtpWriteRead(char*cFtpHost,char*cFile,DWORDdwLen,char*

buf,charcFlag)

{

HINTERNEThInternet,hHost,hFile;

DWORDdwLength,dwError;

hInternet=InternetOpen("FZYXB",LOCAL_INTERNET_ACCESS,NULL,0,0);

hHost=InternetConnect(hInternet,cFtpHost,

INTERNET_INVALID_PORT_NUMBER,"fzxucm","abc505",

INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);

if(cFlag==0)//写

hFile=FtpOpenFile(hHost,cFile,GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY,

0)

el

hFile=FtpOpenFile(hHost,cFile,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0

);

if(!hFile)

{

if((dwError=GetLastError())==12003)

ShowMsg(hWin,"文件不存在");

InternetCloHandle(hHost);

InternetCloHandle(hInternet);return0L;

}

if(cFlag==0)

InternetWriteFile(hFile,buf,dwLen,&dwLength);

el

InternetReadFile(hFile,buf,dwLen,&dwLength);

InternetCloHandle(hFile);InternetCloHandle(hHost);

InternetCloHandle(hInternet);

returndwLength;

}

//通过FTP协议删除FTP服务器上文件的函数cFtpHost主机地址cFile文件

BOOLMyFtpDeleteFile(char*cFtpHost,char*cFile)

{

HINTERNEThInternet,hHost;

hInternet=InternetOpen("FZYXB",LOCAL_INTERNET_ACCESS,NULL,0,0);

hHost=InternetConnect(hInternet,cFtpHost,INTERNET_INVALID_PORT_NUMBER

,"fzabc","b505",

INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0);

FtpDeleteFile(hHost,cFile);

InternetCloHandle(hHost);InternetCloHandle(hInternet);

returnTRUE;

}

//本地计算机运行线程函数pp功能代码

voidCallThread(void*pp)

{

DWORD*dwId,dwLen,ret,ll;

RASPPPIPrip;

charszIp[50],*pdest;

dwId=(DWORD*)pp;

switch(*dwId)

{

caIDC_CALL://通知远程计算机登录Internet

ShowMsg(hWin,"Callremote...");

if(StartCon(hWin,"connect","","d123","9W7607714")==TRUE)

{

ShowMsg(hWin,"RemoteConnected");

//取remote分配的IP地址

=sizeof(RASPPPIP);

if

((ret=RasGetProjectionInfo(hCon,RASP_PppIp,(LPVOID)&rip,(LPDWORD)&ll

))!=0)

ShowMsg(hWin,"取IP地址失败");

el

{

ShowMsg(hWin,dress);

strcpy(szIp,dress);

pdest=strrchr(szIp,‘.');

*pdest=‘0';strcat(szIp,".1");

ShowMsg(hWin,szIp);

SendCmd(szIp,"REQUEST");

}

RasHangUp(hCon);

}

el

ShowMsg(hWin,"Callremotefail");

hCon=NULL;

break;

caIDC_INTERNET://本地计算机登录Internet

ShowMsg(hWin,"正在连接Internet...");

StartCon(hWin,"internet","local@","aabb99","9W163");

break;

caIDC_ADDRESS://读取远程计算机InternetIP地址

ShowMsg(hWin,"正在取IP地址...");

if

((dwLen=FtpWriteRead("","",40,cRemoteIP,1))>

0)

{

cRemoteIP[dwLen]=‘0';ShowMsg(hWin,cRemoteIP);

ShowMsg(hWin,"删除IP地址文件..");

MyFtpDeleteFile("","");

}

el

ShowMsg(hWin,"取IP失败");

break;

caIDC_RDISC://通知远程计算机断开Internet连接

ShowMsg(hWin,"正在向远端发Disconnect...");

SendCmd(cRemoteIP,"DISCONNECT");

break;

}

ThreadId=0;hThread=NULL;

return;

}

//远程计算机运行线程函数

voidServerThread(void*pp)

{

RASPPPIPrip;

DWORDret,ll;

SOCKADDR_INacc_sin,dest_sin;//地址

intacc_sin_len,status;

charszMsg[MY_MSG_LENGTH];

rv_sock=socket(AF_INET,SOCK_STREAM,0);

dest__family=AF_INET;

dest__addr.s_addr=INADDR_ANY;

dest__port=htons(1023);

bind(rv_sock,(structsockaddrFAR*)&dest_sin,sizeof(dest_sin));

listen(rv_sock,MAX_PENDING_CONNECTS);

while(TRUE)

{

acc_sin_len=sizeof(acc_sin);ShowMsg(hWin,"等待呼叫");

rsock=accept(rv_sock,(structsockaddrFAR*)&acc_sin,(intFAR*)

&acc_sin_len);

if(rsock<0)

{ShowMsg(hWin,"AcceptError!");break;}

ShowMsg(hWin,"收到连接请求!");

status=recv(rsock,szMsg,MY_MSG_LENGTH,NO_FLAGS_SET);

if(status==SOCKET_ERROR)

{ShowMsg(hWin,"RecvError!");break;}

if(status)

{

szMsg[status]=‘0';ShowMsg(hWin,szMsg);

if(strstr(szMsg,"REQUEST")!=NULL)

{

ind(rsock,"OK",2,0);

closocket(rsock);Sleep(3000);//等待拨号连接退出

if(StartCon(hWin,"163","remote@","abcd","163")==TRUE)

{

//取动态分配的IP地址

=sizeof(RASPPPIP);

if

((ret=RasGetProjectionInfo(hCon,RASP_PppIp,(LPVOID)&rip,(LPDWORD)&ll

))!=0)

{ShowMsg(hWin,"取IP地址失败");break;}

ShowMsg(hWin,dress);ShowMsg(hWin,"SendIPAdrress....!");

FtpWriteRead("","",strlen(dress),r

dress,0);

}

el

{ShowMsg(hWin,"Connectinternetfail");}

}//if(strstr(szMsg,"REQUEST")!=NULL)

if(strstr(szMsg,"DISCONNECT")!=NULL)

{

nd(rsock,"OK",2,0);

closocket(rsock);RasHangUp(hCon);

}//endif(strstr(szMsg,"DISCONNECT")!=NULL)

}//endif(status)

el

{ShowMsg(hWin,"连接断开!等待下一个");

closocket(rsock);}

}//endwhile(TRUE)

if(hCon!=NULL)

{RasHangUp(hCon);Sleep(3000);}

hCon=NULL;closocket(rv_sock);hThread=NULL;

return;

}

//实现本地计算机向远程计算机发送命令的函数cIp远程计算机IP地址

SzCmd命令字符串

BOOLSendCmd(char*cIp,char*szCmd)

{

SOCKADDR_INdest_sin;//地址

intstatus;

charszMsg[MY_MSG_LENGTH];

rsock=socket(AF_INET,SOCK_STREAM,0);

dest__family=AF_INET;dest__addr.s_addr=inet_addr(cIp);

dest__port=htons(1023);

if(connect(rsock,(PSOCKADDR)&dest_sin,sizeof(dest_sin))<0)

{ShowMsg(hWin,"连接失败");closocket(rsock);

returnFALSE;}

if(nd(rsock,szCmd,strlen(szCmd),0)!=strlen(szCmd))

{ShowMsg(hWin,"送命令失败");closocket(rsock);

returnFALSE;}

status=recv(rsock,szMsg,MY_MSG_LENGTH,NO_FLAGS_SET);

if(status==SOCKET_ERROR)

{ShowMsg(hWin,"RecvError!");closocket(rsock);

returnFALSE;}

szMsg[status]=‘0';

if(status!=0&&strstr(szMsg,"OK")!=NULL)

{closocket(rsock);returnTRUE;}

closocket(rsock);returnFALSE;

}

本文发布于:2023-03-03 04:31:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1677789095119088.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:拨号服务器.doc

本文 PDF 下载地址:拨号服务器.pdf

标签:拨号服务器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26 专利检索|