取得拨号上网时动态分配IP的两种方法
1:使用socket函数。 在拨号前先取得所有本地IP,记录到字符串列表里。 拨号成功后再遍历一次所有本地IP,和已经记录在字符串列表里IP比较。新增加的IP地址就是拨号上网时动态分配IP了。
2:使用和RAS有关API。 在vc里可以方便使用和ras相关的API。但在C++Builder 6里会出现由版本不同引起的错误。 所以在BCB里关键是要自己指定函数的大小。
以下代码在win2000 + C++Builder 6 环境下编译通过。
在Form里添加2个Edit,3个Button;
//---------------------------------------------------------------------------
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TEdit *Edit1; TButton *Button1; TButton *Button2; TEdit *Edit2; TButton *Button3; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); private: // User declarations TStringList *m_slIp; public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
//---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" #include <winsock2.h> #include <ras.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { m_slIp = new TStringList(); } //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) { WORD wVersionRequested; WSADATA wsaData; char cHostName[64] = {0}; HOSTENT *pHost = NULL; AnsiString psIp; int Index; wVersionRequested = MAKEWORD(2, 0);
if(0 != WSAStartup(wVersionRequested, &wsaData)) { WSACleanup(); ShowMessage("socket版本号不对"); }
if(0 == gethostname(cHostName, 64)) { pHost = gethostbyname(cHostName); if(pHost != NULL) { for(int i=0; pHost->h_addr_list[i]!=NULL; i++) { IN_ADDR *p = (IN_ADDR *)(pHost->h_addr_list[i]); psIp = inet_ntoa(*p); m_slIp->Add(psIp); //IP地址存入字符串列表 } } else { WSACleanup(); ShowMessage("取IP地址失败"); } } else { ShowMessage("取机器名失败"); }
WSACleanup();
} //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { RASCONN RASconn; //活动连接 DWORD BuffSize ; //活动连接所占内存大小; DWORD ConnNum; //活动连接数目 RASconn.dwSize=692; //必须指定一个连接的内存大小; BuffSize=692; RASPPPIP rip; AnsiString ModemIp; ZeroMemory(&rip, sizeof(rip));
DWORD size; size = 40; rip.dwSize = 40;
DWORD dwReturn=RasEnumConnections(&RASconn,&BuffSize,&ConnNum); if(dwReturn==0) { if(ConnNum>0) { //ShowMessage("没有拨号连接!"); if ( (RasGetProjectionInfo(RASconn.hrasconn,RASP_PppIp, &rip, &size ) ) != 0 ) { ShowMessage("取IP地址失败"); } else { Edit2->Text = rip.szIpAddress ; } } else { ShowMessage("没有拨号连接!"); } } else ShowMessage("RasEnumConnections函数失败!");
} //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { WORD wVersionRequested; WSADATA wsaData; char cHostName[64] = {0}; HOSTENT *pHost = NULL; AnsiString psIp; int Index; wVersionRequested = MAKEWORD(2, 0);
if(0 != WSAStartup(wVersionRequested, &wsaData)) { WSACleanup(); ShowMessage("socket版本号不对"); }
if(0 == gethostname(cHostName, 64)) { pHost = gethostbyname(cHostName); if(pHost != NULL) { for(int i=0; pHost->h_addr_list[i]!=NULL; i++) { IN_ADDR *p = (IN_ADDR *)(pHost->h_addr_list[i]); psIp = inet_ntoa(*p); if(m_slIp->IndexOf(psIp) < 0) { Edit1->Text = psIp; } } } else { WSACleanup(); ShowMessage("取IP地址失败"); } } else { ShowMessage("取机器名失败"); }
WSACleanup(); delete m_slIp; } //---------------------------------------------------------------------------
先在上网前单击Button1, 上网后再单击Butto3得到就是拨号IP. 
|