请教在bcb中如何获取本机的IP地址?

wwwunix 2000-08-28 10:39:00
...全文
1001 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCB 2000-12-26
  • 打赏
  • 举报
回复
若有多个地址,下面的程序可一一列具出,可自行改成DELPHI:
#include "winsock.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSAData wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData); //初始化WINSOCK调用

char HostName[64]; //存放本主机名
HOSTENT *lpHostEnt;
gethostname(HostName,sizeof(HostName)); //利用得到的主机名去获得主机结构
Edit1->Text=HostName;
lpHostEnt=gethostbyname(HostName); //利用主机名去取主机结构

for (int i=0; lpHostEnt->h_addr_list[i]!=NULL; i++)
{
IN_ADDR *p=(IN_ADDR *)(lpHostEnt->h_addr_list[i]);
String IP=inet_ntoa(*p);
Memo1->Lines->Add(IP);
}

WSACleanup(); //释放WINSOCK调用
}
BCB 2000-12-22
  • 打赏
  • 举报
回复
#include "winsock.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSAData wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData); //初始化WINSOCK调用

char HostName[64]; //存放本主机名
HOSTENT *lpHostEnt;
gethostname(HostName,sizeof(HostName)); //利用得到的主机名去获得主机结构
Edit1->Text=HostName;
lpHostEnt=gethostbyname(HostName); //利用主机名去取主机结构

for (int i=0; lpHostEnt->h_addr_list[i]!=NULL; i++)
{
IN_ADDR *p=(IN_ADDR *)(lpHostEnt->h_addr_list[i]);
String IP=inet_ntoa(*p);
Memo1->Lines->Add(IP);
}

WSACleanup(); //释放WINSOCK调用
}
BCB 2000-12-22
  • 打赏
  • 举报
回复
TCLientSocket 与 TServerSocket
若未连接过,LoalAddress 是空的,
这不行,多个IP也无能为力!

BCB 2000-12-22
  • 打赏
  • 举报
回复
初始化不能省,稍改后,将所有IP都能显示在Memo1

#include "winsock.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WSAData wsaData;
WSAStartup(MAKEWORD(2,0),&wsaData); //初始化WINSOCK调用
char HostName[80]; //存放本主机名
LPHOSTENT lpHostEnt;
gethostname(HostName,sizeof(HostName)); //利用得到的主机名去获得主机结构
Edit1->Text=HostName;
lpHostEnt=gethostbyname(HostName); //利用主机名去取主机结构

for (int i=0; lpHostEnt->h_addr_list[i]!=0; i++)
{
struct in_addr *p=(struct in_addr *)(lpHostEnt->h_addr_list[i]);
String IP=inet_ntoa(*p);
Memo1->Lines->Add(IP);
}
WSACleanup(); //释放WINSOCK调用
}
BCB 2000-12-22
  • 打赏
  • 举报
回复
Slash:
可能要加个#include "winsock.h"或winsock2.h
sIPAddress = inet_ntoa(*(struct in_addr*)pHost->h_addr_list[0]);
这一句通不过





FengSC 2000-08-28
  • 打赏
  • 举报
回复
如果你使用的是TServerSocket或TClientSocket;
它们的Socket属性中有一个LocalAddress属性是本地地址。
例:Label1->Caption = ServerSocket1->Socket->LocalAddress;
Slash 2000-08-28
  • 打赏
  • 举报
回复
太麻烦了,看下面的

// Get host address
char Buffer[64];
HOSTENT FAR *pHost;
AnsiString sIPAddress;

gethostname(Buffer, 64);
pHost = gethostbyname(Buffer);
sIPAddress = inet_ntoa(*(struct in_addr*)pHost->h_addr_list[0]);

// If have many ip address, then
// look h_addr_list[1], etc, until encounter a NULL pointer
Wingsun 2000-08-28
  • 打赏
  • 举报
回复
如下代码:
WSAData wsaData;
if (WSAStartup(MAKEWORD(2,0),&wsaData)!=0)
{ //初始化WINSOCK调用
MessageBox(NULL,"Wrong WinSock Version","Error",MB_OK);
return ;
}
char HostName[80];
LPHOSTENT lpHostEnt;
struct in_addr addr[2];
//本程序假设主机不是多宿主机,即最多只有
// 一块网卡和一个动态IP
for (int i=0; i< 2; i++)
{
memset(&addr[i],0,sizeof(in_addr));
//对in_addr结构清0,以利后面填写
}
if (gethostname(HostName,sizeof(HostName))==SOCKET_ERROR)
{ // 得到本主机名
MessageBox(NULL,"Can't getting local host name.","Error",MB_OK);
return ;
}
Label1->Caption=HostName;
lpHostEnt=gethostbyname(HostName);//利用得到的主机名去获得主机结构
if (!lpHostEnt)
{
MessageBox(NULL,"Yow! Bad host lookup.","Error",MB_OK);
return ;
}
for (int i=0; lpHostEnt->h_addr_list[i]!=0; i++)
//从主机地址表中得到IP地址
{
memcpy(&addr[i],lpHostEnt->h_addr_list[i],sizeof(in_addr));
}
Label2->Caption=inet_ntoa(addr[0]);
Label3->Caption=inet_ntoa(addr[1]);
WSACleanup(); //释放WINSOCK调用

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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