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

原创 2003年12月02日 22:00:00

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

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

              取得拨号上网时动态分配IP的两种方法1:使用socket函数。在拨号前先取得所有本地IP,记录到字符串列表里。拨号成功后再遍历一次所有本地IP,和已经记录在字符串列表里IP...
  • zxcdewq
  • zxcdewq
  • 2003年12月02日 22:00
  • 720

VC实现 拨号连接及动态IP地址获取

在Win32 API 函数中有一组用于实现远程连接服务RAS 的函数,利用这些函数通过编程可以实现建立和Internet 的拨号连接,并可获得Internet 分配给主机的动态IP 地址。 一、...
  • jiangqin115
  • jiangqin115
  • 2015年01月05日 17:44
  • 1254

解决动态IP或拨号上网客户端访问公网Postgresql的授权问题

Postgresql数据库出于安全考虑,对于所有连接的客户端需要授权才能访问,但对于在家办公的用户其公网IP并不固定,或者都不知道自己是通过几次转换访问的外网,因此很难通过IP段授权。...
  • wayne_sulong
  • wayne_sulong
  • 2015年10月05日 22:41
  • 480

函数调用时两种传参方式

函数在调用的时候有两种传参方式:一种是值传递,另一种是引用传递。 值传递:传递的是变量本身的值。一般程序中的值传递都是基本数据类型,如:int、char、double、float、long等等。 ...
  • qq378718095
  • qq378718095
  • 2017年10月18日 20:12
  • 60

RAS使用拨号网络拨号的类

RAS Socket 拨号网络
  • 91program
  • 91program
  • 2011年04月09日 08:49
  • 3981

VPN常见问题原因与解决

 自己整理的VPN常见问题原因与解决  VPN服务器什么地方可能出现故障当客户端与某个ISP建立连接时(这种连接使用VPN连接中的点对点协议--PPP--部分),ISP将为客户端分配一个IP地址、一个...
  • airsoft
  • airsoft
  • 2005年01月14日 16:48
  • 7436

PHP获取准确的IP地址的方法

// 获取IP地址 function GetIP() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'),...
  • HRsunpeng
  • HRsunpeng
  • 2016年06月16日 12:01
  • 222

动态分配二维数组的两种方法

//第一种方法 int **a; int i; a = (int **)malloc(sizeof(int *) * 10); for (i = 0; i
  • xieyi2015
  • xieyi2015
  • 2016年07月18日 12:37
  • 168

RAS拔号上网

这两天把CE板儿上的拔号程序初步完成,第一个是CE板儿上自带的MODEM无法使用,最终还是从网上看到一个牛人说改注册表然后映射到COM2口上,很简单的事情,有些时候儿没有弄过就会不知道如何下手。软件倒...
  • dragon101788
  • dragon101788
  • 2011年12月01日 14:39
  • 1042

ras拨号的方式和问题

//RAS拨号的同步和异步问题,如果这个问题不搞清楚,就谈不上消息的截获和同步的线程监视。  //dwRet := RasDialA(NiL,NiL,@rdParams,0,NiL,@hRasC...
  • ilvu999
  • ilvu999
  • 2012年11月21日 10:51
  • 378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:取得拨号上网时动态分配IP的两种方法
举报原因:
原因补充:

(最多只允许输入30个字)