请问在c++builder里怎么根据主机名动态获得IP?(100分)

  • 主题发起人 主题发起人 oldwolf202
  • 开始时间 开始时间
O

oldwolf202

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个网关程序,现在我要在网关上动态分配IP,而主机名是不变的,我想根据主机名来取IP。我写的程序如下:
char FAR mname[255];
int iErrorCode;
struct WSAData *WSAData;
WSAStartup(2,WSAData);
iErrorCode = gethostname(mname, 255);
struct hostent FAR * pHostent;
pHostent = (struct hostent * )malloc(sizeof(struct hostent));
pHostent = gethostbyname(mname);
ShowMessage(mname);

程序单步调试时MNAME的值一直为一串0 !
是出了什么问题呢?
后来有个朋友帮我写了一个DELPHI下的程序:
使用 WinSock 单元;
过程如下:
function HostToIP(Name: string;
var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then
begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then
begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else
begin
Result := False;
end;
finally
WSACleanup;
end
end;
请问上面的程序怎么改写成c++builder程序?
我改了半天总是有问题,请高手帮助?
或者有没有其他更好的方法?
 
没人理??
解决问题立即给分啊
 
请高手指点
我急用!
 
急用啊,请指点
 
晕啊,分少的话,解决问题的我再加分!
 
gethostname之后再gethostbyname即可
 
iErrorCode = gethostname(mname, 255);
struct hostent FAR * pHostent;
pHostent = (struct hostent * )malloc(sizeof(struct hostent));
pHostent = gethostbyname(mname);
我开始写的程序就是这样的啊?
请说详细点好吗?
 
yt_wyb 你能帮我改一下吗?我搞不清楚错在那里。
我是采鸟一个,请高手指点
 
没有人肯回答吗?
这个东西也不是很难,请高手门指点一下啊
 
现在程序是:
if(FrmMain->ADOQuery1->FieldByName("PROXYOUTIP")->AsString==0)
{ char FAR mname[255];
char addr[255];
int iErrorCode;
AnsiString IP;
struct WSAData *WSAData;
WSAStartup(2,WSAData);
iErrorCode = gethostname(mname, 255);
struct hostent FAR * pHostent;
pHostent = (struct hostent * )malloc(sizeof(struct hostent));
pHostent = gethostbyname(mname);
ShowMessage(mname);
//下面的程序开始出错:
addr = pHostent->h_addr_list;

IP = Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
前面程序已经通过就是在显示IP的时候不知道怎么做
请指教
 
这是我刚做的例子
//---------------------------------------------------------------------------
#include <vcl.h>
#include <winsock2.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int GetHostAddress(const char *HostName, char *Address)
{
struct hostent *host;
struct in_addr Addr;
host = gethostbyname(HostName);
if (host == (struct hostent *)NULL)
return -1;
memcpy(&amp;Addr, host->h_addr, host->h_length);
strcpy(Address, inet_ntoa(Addr));
return 0;
}
bool InitWinSock()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 0);
//调用WinSock2 DLL
err = WSAStartup(wVersionRequested, &amp;wsaData);
if (err != 0)
return false;
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!= 0){
WSACleanup();
return false;
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char buf[100]="";
GetHostAddress(Edit1->Text.c_str(), buf);
ShowMessage(buf);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (!InitWinSock())
ShowMessage("初始化WinSock失败!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
WSACleanup();
}
//---------------------------------------------------------------------------
 
非常感谢sachow的帮助,问题已经解决,谢谢!
 
5555~~~~~~~~~~~~~~~
我把分给错人了!!!!!
sachow我再开个帖子你进来拿分,不过我现在一共只有88分了
不好意思,一时激动,给分的时候点错了。。
 
sachow请到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1999174
拿分
 
后退
顶部