如何设置本机IP地址

Leighf 2011-05-09 12:48:45
想做这样一个东西,首次运行记录下本机的IP地址

发现IP更改后需要还原成原来的IP,该这么弄呢?

另:如何读取子网掩码,网关等信息。
...全文
208 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leighf 2011-05-13
  • 打赏
  • 举报
回复
里面的一些 参数定义、头文件 什么的我没搞明白,能在帮忙下么
CppFile 2011-05-09
  • 打赏
  • 举报
回复
好久以前写的一个程序,里面有相关的功能代码,楼主参考一下

void __fastcall TIpChangerMainForm::FormCreate(TObject *Sender)
{
//清空控件
ComboBox1->Items->Clear();
Edit1->Text="";
Edit2->Text="";
Edit3->Text="";
Edit4->Text="";
Edit5->Text="";
Edit6->Text="";
Label26->Caption="";
Label13->Caption="";

pStatus=(MIB_IPSTATS*)new char[sizeof(MIB_IPSTATS)];
OldReceiveNumber=0;
//读取数据,填充结构体
int iAdapterNumber=0;
//计算有几块网卡,准备初始化结构体
ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfo=(IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
IP_ADAPTER_INFO *pAdapterInfoBkp;
if(GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
{
delete pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
}
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
{
pAdapterInfoBkp=pAdapterInfo;
while(pAdapterInfo){ // 遍历所有适配器,取得网络适配器数量
if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
iAdapterNumber++;
}
pAdapterInfo = pAdapterInfo->Next;
}
}
ArrayAdapterInfo.Length=iAdapterNumber;

pAdapterInfo=pAdapterInfoBkp;
int i=0;
//读取网卡名字到ComboBox中
while(pAdapterInfo){ // 遍历所有适配器
if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
ComboBox1->Items->Add(pAdapterInfo->Description);
ArrayAdapterInfo[i]=*pAdapterInfo;
i++;
}
pAdapterInfo = pAdapterInfo->Next;
}


ComboBox1->ItemIndex=0;
SetDisplay(0);
//取得选中的网卡的index
OldAdapterIndex=ArrayAdapterInfo[0].Index;
NewAdapterIndex=OldAdapterIndex;
delete pAdapterInfo;
//读取TCP连接列表
Timer2->Enabled=true;
Timer2Timer(Sender);
}
//---------------------------------------------------------------------------

void TIpChangerMainForm::SetDisplay(int i)
{
//显示ip地址,mask,gateway
IP_ADDR_STRING *pIpList=&ArrayAdapterInfo[i].IpAddressList;
IP_ADDR_STRING *pGateWayList=&ArrayAdapterInfo[i].GatewayList;
while(pIpList)
{
Edit2->Text=pIpList->IpAddress.String;

Edit3->Text=pIpList->IpMask.String;
pIpList=pIpList->Next;
}

while(pGateWayList)
{
Edit4->Text=pGateWayList->IpAddress.String;
pGateWayList=pGateWayList->Next;
}
//显示DNS服务器
ULONG ulAdapterInfoSizePer = sizeof(IP_PER_ADAPTER_INFO);
IP_PER_ADAPTER_INFO *pAdapterInfoPer=(IP_PER_ADAPTER_INFO*)new char[ulAdapterInfoSizePer];
if(GetPerAdapterInfo(ArrayAdapterInfo[i].Index, pAdapterInfoPer, &ulAdapterInfoSizePer) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
{
delete pAdapterInfoPer;
pAdapterInfoPer = (IP_PER_ADAPTER_INFO*)new char[ulAdapterInfoSizePer];
}
if( GetPerAdapterInfo(ArrayAdapterInfo[i].Index,pAdapterInfoPer, &ulAdapterInfoSizePer) == ERROR_SUCCESS )
{
//取DNS
IP_ADDR_STRING *pDnsList=&pAdapterInfoPer->DnsServerList;
while(pDnsList)
{
Edit5->Text=pDnsList->IpAddress.String;
pDnsList=pDnsList->Next;
if(!pDnsList) break;
Edit6->Text=pDnsList->IpAddress.String;
pDnsList=pDnsList->Next;
}
delete pDnsList;
}
//显示物理地址
AnsiString StrMacAddress="";
DynamicArray<BYTE> MacArray;
MacArray.Length=ArrayAdapterInfo[i].AddressLength;
for(int j=0;j<int(ArrayAdapterInfo[i].AddressLength);j++)
{
MacArray[j]=ArrayAdapterInfo[i].Address[j];
}
for(int j=0;j<int(ArrayAdapterInfo[i].AddressLength)-1;j++)
{
StrMacAddress=StrMacAddress+IntToHex(MacArray[j],2)+"-";
}
StrMacAddress=StrMacAddress+IntToHex(MacArray[int(ArrayAdapterInfo[i].AddressLength)-1],2);
Edit1->Text=StrMacAddress;
//显示折线图
Timer1->Enabled=true;
if(GetIpStatistics(pStatus)==NO_ERROR)
{
OldReceiveNumber=pStatus->dwInReceives;
OldOutRequest=pStatus->dwOutRequests;
}

delete pAdapterInfoPer;
delete pGateWayList;
delete pIpList;
MacArray.Length=0;
}

CsharpGame 2011-05-09
  • 打赏
  • 举报
回复
这些信息存储在注册表里,通过对注册表的操作进行更改,BCB有专门针对注册表进行操作的类!
Infiltration 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 leighf 的回复:]
想做这样一个东西,首次运行记录下本机的IP地址

发现IP更改后需要还原成原来的IP,该这么弄呢?

另:如何读取子网掩码,网关等信息。
[/Quote]
注册表、

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧