高分征解特别特别麻烦的问题!!!如何从win98的拨号服务器获得客户机的ip? 从客户获取服务器的IP我倒知道,但从服务器获取客户的IP我却不知道了!热烈关注! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Windows98的拨号服务器,不会给客户IP!你到哪里去获取?好好看看MSDN,不是所有网路都靠TCP/IP协议的...... 不是阿,我们之间只用了tip/ip协议所以服务端应该给客户端分配了ip的吧,客户端是用来下载服务端的文件的 Windows的拨号网络应该是用PPP协议封装IP包的吧客户的IP地址是PPP协商获得的 拨号上网,服务器动态分配给客户端一个IP,不信去看看win2000中拨号连接后的连接属性的详细资料,我现在的客户端ip=61.128.150.78,服务器IP=61.128.128.203,传输=TCP/IP,服务器类型PPP。至于怎样得到客户端ip,我也在MSDN中寻找。那位找到后告诉我一声。 你可做个实验,拨号连接成功后,获取本机IP,看是否和win2000报告的一样,若一样,你就成功了。 在VC 中 是 通 过 调 用 函 数RasGetProjectionInfo() 来 获 取IP 地 址 的。函 数 调 用 成 功 时 返 回0 值, 此 时 在 RASPPPIP 结 构 变 量 中 的szIpAddress 就 是 动 态IP 地址。 控制远程计算机拨号上网并获取其IP地址转载自《计算机世界日报》 (文/许春漫)---- 本 文 提 出 采 用Win98 拨 号 网 络 服 务 器、FTP 协 议 和 免 费 个 人 主 页 空 间 站 点 实 现 控 制 远 程 计 算 机 拨 号 上 网 并 获 取 其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_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);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: // 本 地 计 算 机 登 录Internet ShowMsg(hWin,“ 正 在 连 接 Internet... "); StartCon( hWin,“internet",“[email protected]", “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",“[email protected]",“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.szIpAddress,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;‹} 不是有个GETPEERNAME方法吗? andy1976: 可以告诉我具体的操作吗? 咨询:定时器搜索多个文件夹的文件的问题 MFC多线程相关问题请教 急!如何将程序运行后的数据保存在HTM文件中? ocx和dll文件有什么区别吗?? 获取鼠标空闲时间的问题 如何写一个程序可以给另一个程序发消息! 一个面试题, 是定义引用变量的,大家进来瞧瞧....... 初学VC,可以简单的讲解一下什么消息映射吗?谢谢,在线等! 小小问题,一直恭候 大送分 感谢xiaozuo!!!(请跟帖!) No.3 谁知道CDocument的DoSave动作和含义,小弟的OnFileSaveAs有时不会被调用,怎么回事呢?
好好看看MSDN,不是所有网路都靠TCP/IP协议的......
所以服务端应该给客户端分配了ip的吧,客户端是用来下载服务端的文件的
客户的IP地址是PPP协商获得的
----许 多 计 算 机 系 统 需 要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_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);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:
// 本 地 计 算 机 登 录Internet
ShowMsg(hWin,“ 正 在 连 接 Internet... ");
StartCon( hWin,“internet",“[email protected]",
“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",“[email protected]",
“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.szIpAddress,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;‹
}