控制远程计算机拨号上网并获取其IP地址.docx
《控制远程计算机拨号上网并获取其IP地址.docx》由会员分享,可在线阅读,更多相关《控制远程计算机拨号上网并获取其IP地址.docx(9页珍藏版)》请在冰豆网上搜索。
![控制远程计算机拨号上网并获取其IP地址.docx](https://file1.bdocx.com/fileroot1/2023-1/23/4539e4cd-7aa2-42fd-86da-8e4c9101116a/4539e4cd-7aa2-42fd-86da-8e4c9101116a1.gif)
控制远程计算机拨号上网并获取其IP地址
控制远程计算机拨号上网并获取其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地址
SOCKETserv_sock,rsock;//服务端
//建立拨号连接函数,成功返回TRUEelseFALSE
//szEntry拨号连接名szPhone电话号码szUser和szPassword分别为internet的用户名和口令
BOOLStartCon(HWNDhWnd,char*szEntry,char*szUser,char*szPassword,char*szPhone)
{
RASDIALPARAMSrdParams;
DWORDdwRet;
charszBuf[300];
rdParams.dwSize=sizeof(RASDIALPARAMS);
lstrcpy(rdParams.szEntryName,szEntry);
strcpy(rdParams.szPhoneNumber,szPhone);
rdParams.szCallbackNumber[0]=‘\0';
strcpy(rdParams.szUserName,szUser);
strcpy(rdParams.szPassword,szPassword);
rdParams.szDomain[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)
else
hFile=FtpOpenFile(hHost,cFile,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0);
if(!
hFile)
{
if((dwError=GetLastError())==12003)
ShowMsg(hWin,"文件不存在");
InternetCloseHandle(hHost);
InternetCloseHandle(hInternet);return0L;
}
if(cFlag==0)
InternetWriteFile(hFile,buf,dwLen,&dwLength);
else
InternetReadFile(hFile,buf,dwLen,&dwLength);
InternetCloseHandle(hFile);InternetCloseHandle(hHost);
InternetCloseHandle(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);
InternetCloseHandle(hHost);InternetCloseHandle(hInternet);
returnTRUE;
}
//本地计算机运行线程函数pp功能代码
voidCallThread(void*pp)
{
DWORD*dwId,dwLen,ret,ll;
RASPPPIPrip;
charszIp[50],*pdest;
dwId=(DWORD*)pp;
switch(*dwId)
{
caseIDC_CALL:
//通知远程计算机登录Internet
ShowMsg(hWin,"Callremote...");
if(StartCon(hWin,"connect","","d123","9W7607714")==TRUE)
{
ShowMsg(hWin,"RemoteConnected");
//取remote分配的IP地址
rip.dwSize=sizeof(RASPPPIP);
if((ret=RasGetProjectionInfo(hCon,RASP_PppIp,(LPVOID)&rip,(LPDWORD)&ll))!
=0)
ShowMsg(hWin,"取IP地址失败");
else
{
ShowMsg(hWin,rip.szIpAddress);
strcpy(szIp,rip.szIpAddress);
pdest=strrchr(szIp,‘.');
*pdest=‘\0';strcat(szIp,".1");
ShowMsg(hWin,szIp);
SendCmd(szIp,"REQUEST");
}
RasHangUp(hCon);
}
else
ShowMsg(hWin,"Callremotefail");
hCon=NULL;
break;
caseIDC_INTERNET:
//本地计算机登录Internet
ShowMsg(hWin,"正在连接Internet...");
StartCon(hWin,"internet","local@","aabb99","9W163");
break;
caseIDC_ADDRESS:
//读取远程计算机InternetIP地址
ShowMsg(hWin,"正在取IP地址...");
if((dwLen=FtpWriteRead("","abc.txt",40,cRemoteIP,1))>0)
{
cRemoteIP[dwLen]=‘\0';ShowMsg(hWin,cRemoteIP);
ShowMsg(hWin,"删除IP地址文件..");
MyFtpDeleteFile("","abc.txt");
}
else
ShowMsg(hWin,"取IP失败");
break;
caseIDC_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];
serv_sock=socket(AF_INET,SOCK_STREAM,0);
dest_sin.sin_family=AF_INET;
dest_sin.sin_addr.s_addr=INADDR_ANY;
dest_sin.sin_port=htons(1023);
bind(serv_sock,(structsockaddrFAR*)&dest_sin,sizeof(dest_sin));
listen(serv_sock,MAX_PENDING_CONNECTS);
while(TRUE)
{
acc_sin_len=sizeof(acc_sin);ShowMsg(hWin,"等待呼叫");
rsock=accept(serv_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)
{
isend(rsock,"OK",2,0);
closesocket(rsock);Sleep(3000);//等待拨号连接退出
if(StartCon(hWin,"163","remote@","abcd","163")==TRUE)
{
//取动态分配的IP地址
rip.dwSize=sizeof(RASPPPIP);
if((ret=RasGetProjectionInfo(hCon,RASP_PppIp,(LPVOID)&rip,(LPDWORD)&ll))!
=0)
{ShowMsg(hWin,"取IP地址失败");break;}
ShowMsg(hWin,rip.szIpAddress);ShowMsg(hWin,"SendIPAdrress....!
");
FtpWriteRead("","abc.txt",strlen(rip.szIpAddress),rip.szIpAddress,0);
}
else
{ShowMsg(hWin,"Connectinternetfail");}
}//if(strstr(szMsg,"REQUEST")!
=NULL)
if(strstr(szMsg,"DISCONNECT")!
=NULL)
{
send(rsock,"OK",2,0);
closesocket(rsock);RasHangUp(hCon);
}//endif(strstr(szMsg,"DISCONNECT")!
=NULL)
}//endif(status)
else
{ShowMsg(hWin,"连接断开!
等待下一个");
closesocket(rsock);}
}//endwhile(TRUE)
if(hCon!
=NULL)
{RasHangUp(hCon);Sleep(3000);}
hCon=NULL;closesocket(serv_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_sin.sin_family=AF_INET;dest_sin.sin_addr.s_addr=inet_addr(cIp);
dest_sin.sin_port=htons(1023);
if(connect(rsock,(PSOCKADDR)&dest_sin,sizeof(dest_sin))<0)
{ShowMsg(hWin,"连接失败");closesocket(rsock);
returnFALSE;}
if(send(rsock,szCmd,strlen(szCmd),0)!
=strlen(szCmd))
{ShowMsg(hWin,"送命令失败");closesocket(rsock);
returnFALSE;}
status=recv(rsock,szMsg,MY_MSG_LENGTH,NO_FLAGS_SET);
if(status==SOCKET_ERROR)
{ShowMsg(hWin,"RecvError!
");closesocket(rsock);
returnFALSE;}
szMsg[status]=‘\0';
if(status!
=0&&strstr(szMsg,"OK")!
=NULL)
{closesocket(rsock);returnTRUE;}
closesocket(rsock);returnFALSE;
}