控制远程计算机拨号上网并获取其IP地址.doc
控制远程远算机远上远取其号网并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。
三、远取远程远算机Internet IP地址
在取得远程远算机Internet IP地址前,本地远算机是无法通远Internet和远程远算机远行远远通信的。远程远算机登远Internet,远取远远IP地址后,可通远远远子远件方式远远将IP地址通知本地远算机,也可通远远远将IP地址保存在远程、本地远算机都可远远到的FTP服远器文件中,供本地远算机远取。本文采用后一远方法,若有合适的没FTP服远器,可到提供免远主远空远允远以FTP方式远远的Web站点上申远一远空远,供远程、本地远算机共同远远。
本地远算机登远Internet后,用FTP远远远取指定FTP服远器上含有远程远算机远远IP地址的文本文件,而取得远程远算机的从Internet IP地址,然后,本地远算机便可通远Internet和远程远算机远任何基于启TCP/IP远接的通信远用程序,如利用Pcanywhere控制远程远算机,可通远远程远算机远远远程远算机相远的并与
整远远源个网,到远远程远算机系远远行远远的目的。达
四、通知远程远算机远断Internet远接
当本地远算机和远程远算机通信远束后,便可通知远程远算机远断Internet远接。利用远程远算机的Internet IP地址,本地远算机和远程远算机建立TCP/IP远接,送
出远断Internet指令,远程远算机收到指令后,回送远消息确,远断Internet远接,等待下一命令的到。个来
五、 程序远远
本地、远程远算机行的是同一道程序运,通远不同的命令按远激活本地、远程来
远算机程序所具有的不同功能。程序采用VC++6.0远写,在Win98远境下远远行运通远。限于篇幅,下面只远出程序的主要部分及注远远明,省去了一些出远远理远远。并
//宏定远
#define MAX_PENDING_CONNECTS 2#define NO_FLAGS_SET 0
#define MY_MSG_LENGTH 100
//全局远量
HRASCONN hCon; //RAS远接句柄
HWND hWin;
HINSTANCE hInst;
DWORD ThreadId=0;
HANDLE hThread=NULL;
char cRemoteIP[50]; //remote IP地址SOCKET serv_sock,rsock; //服远端// 建立远远接函号数,成功返回 TRUE else FALSE// szEntry 远远接名 号szPhone 远远远 号szUser和szPassword分远远internet的用远名
和口令
BOOL StartCon( HWND hWnd,char * szEntry,char * szUser,char *
szPassword,char * szPhone )
{
RASDIALPARAMS rdParams;
DWORD dwRet;
char szBuf[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 );return TRUE;
}
// 通远FTP远远远写FTP服远器上文件的函 数cFlag =0 写=1 远,远成功远返回所远写
写数的字远
DWORD FtpWriteRead(char * cFtpHost,char * cFile,DWORD dwLen,char *
buf,char cFlag)
{
HINTERNET hInternet,hHost,hFile;DWORD dwLength,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_BIN
ARY,0)
else
hFile=FtpOpenFile(hHost,cFile,GENERIC_READ,FTP_TRANSFER_TYPE_BIN
ARY,0);
if( !hFile)
{
if ( (dwError=GetLastError()) == 12003 )
ShowMsg(hWin,"文件不存在");
InternetCloseHandle(hHost);
InternetCloseHandle(hInternet);return 0L;}
if ( cFlag == 0 )
InternetWriteFile(hFile,buf,dwLen,&dwLength);
else
InternetReadFile(hFile,buf,dwLen,&dwLength);
InternetCloseHandle(hFile);InternetCloseHandle(hHost);
InternetCloseHandle(hInternet);
return dwLength;
}
// 通远FTP远远远除FTP服远器上文件的函数cFtpHost 主机地址cFile 文件名BOOL MyFtpDeleteFile(char * cFtpHost,char * cFile)
{
HINTERNET hInternet,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);
return TRUE;
}
// 本地远算机行远程函 运数pp 功能代远
void CallThread(void * pp )
{
DWORD * dwId,dwLen, ret,ll;
RASPPPIP rip;
char szIp[50],*pdest;
dwId=(DWORD *)pp;
switch( * dwId )
{
case IDC_CALL: //通知远程远算机登远Internet
ShowMsg(hWin,"Call remote... ");
if ( StartCon( hWin,"connect","","d123","9W7607714" ) == TRUE )
{
ShowMsg(hWin,"Remote Connected");// 取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,"Call remote fail");hCon=NULL;
break;
case IDC_INTERNET: //本地远算机登远InternetShowMsg(hWin,"正在远接 Internet... ");
StartCon( hWin,"internet","local@pub2.fz.fj.cn","aabb99","9W163" );break;
case IDC_ADDRESS://远取远程远算机Internet IP地址ShowMsg(hWin,"正在取 IP地址...");
if ( (dwLen=FtpWriteRead("ftp.maoming.gd.cn","abc.txt",40,cRemoteIP,1))>0 )
{
cRemoteIP[dwLen]=‘\0';ShowMsg(hWin,cRemoteIP);ShowMsg(hWin,"远除IP地址文件..");
MyFtpDeleteFile("ftp.maoming.gd.cn","abc.txt");
}
else
ShowMsg(hWin,"取IP 失远");
break;
case IDC_RDISC: //通知远程远算机远断Internet远接ShowMsg(hWin,"正在向远端远 Disconnect...");
SendCmd(cRemoteIP,"DISCONNECT");
break;
}
ThreadId=0;hThread=NULL;return;
}
// 远程远算机行远程函运数
void ServerThread(void * pp )
{
RASPPPIP rip;
DWORD ret,ll;
SOCKADDR_IN acc_sin, dest_sin; //地址int acc_sin_len,status;
char szMsg[ 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,(struct sockaddr FAR *)&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,(struct sockaddr FAR *) &acc_sin,(int FAR *) &acc_sin_len );
if (rsock < 0)
{ShowMsg(hWin,"Accept Error!");break;}
ShowMsg(hWin,"收到远接远求!");
status = recv( rsock, szMsg, MY_MSG_LENGTH, NO_FLAGS_SET );
if (status == SOCKET_ERROR){ShowMsg(hWin,"Recv Error!");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@pub2.fz.fj.cn","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," Send IP Adrress.... !");FtpWriteRead( "ftp.maoming.gd.cn","abc.txt",strlen(rip.szIpAddress),rip.szIpAddre
ss,0);
}
else
{ShowMsg(hWin,"Connect internet fail");}
}//if ( strstr(szMsg,"REQUEST") != NULL )
if ( strstr(szMsg,"DISCONNECT") != NULL ){
send(rsock,"OK",2,0);
closesocket(rsock);RasHangUp(hCon);
} //end if ( strstr(szMsg,"DISCONNECT") != NULL )} //end if (status)
else
{ShowMsg(hWin,"远接远断! 等待下一个");
closesocket(rsock);}
} //end while( TRUE )
if(hCon != NULL )
{RasHangUp(hCon);Sleep(3000);}
hCon =NULL;closesocket(serv_sock);hThread=NULL;
return;
}
//远远本地远算机向远程远算机远送命令的函 数cIp 远程远算机IP地址 SzCmd 命令字
符串
BOOL SendCmd(char * cIp,char * szCmd){
SOCKADDR_IN dest_sin; //地址int status;
char szMsg[ 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 );return FALSE;}
if ( send(rsock,szCmd,strlen(szCmd),0) != strlen(szCmd)){ShowMsg(hWin,"送命令失远");closesocket( rsock );return FALSE;}
status = recv( rsock, szMsg, MY_MSG_LENGTH, NO_FLAGS_SET );
if (status == SOCKET_ERROR)
{ShowMsg(hWin,"Recv Error!");closesocket( rsock );return FALSE;}
szMsg[status] = ‘\0';
if ( status != 0 && strstr(szMsg,"OK") != NULL )
{closesocket( rsock );return TRUE;}
closesocket( rsock );return FALSE;}