控制远程计算机拨号上网并获取其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 条评论) |