取得拨号上网时动态分配IP的两种方法

类别:软件工程 点击:0 评论:0 推荐:

              取得拨号上网时动态分配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.

本文地址:http://com.8s8s.com/it/it37478.htm