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

上传人:b****5 文档编号:7362533 上传时间:2023-01-23 格式:DOCX 页数:9 大小:18.80KB
下载 相关 举报
控制远程计算机拨号上网并获取其IP地址.docx_第1页
第1页 / 共9页
控制远程计算机拨号上网并获取其IP地址.docx_第2页
第2页 / 共9页
控制远程计算机拨号上网并获取其IP地址.docx_第3页
第3页 / 共9页
控制远程计算机拨号上网并获取其IP地址.docx_第4页
第4页 / 共9页
控制远程计算机拨号上网并获取其IP地址.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

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

《控制远程计算机拨号上网并获取其IP地址.docx》由会员分享,可在线阅读,更多相关《控制远程计算机拨号上网并获取其IP地址.docx(9页珍藏版)》请在冰豆网上搜索。

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

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

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1