Installshield脚本获取本地IP

本文介绍了一个使用TCP/IP函数获取本地主机IP地址的实现方法。通过调用WSAStartup初始化Winsock,gethostname获取主机名,再利用gethostbyname将主机名解析为IP地址,并最终通过inet_ntoa函数将网络字节序的IP转换为可读字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

ContractedBlock.gifExpandedBlockStart.gifCode
///////////////////////////////////////////////////////////////////////////////
//
// Tcp/Ip function
//
// By: Les Smith
// edit:haozes@gmail.com
//
///////////////////////////////////////////////////////////////////////////////

#define WSADESCRIPTION_LEN      
256
#define WSASYS_STATUS_LEN       
128

typedef
 WSAData
  begin
        
INT                    wVersion;
        
INT                    wHighVersion;
        
string                   szDescription[WSADESCRIPTION_LEN+1];
        
string                    szSystemStatus[WSASYS_STATUS_LEN+1];
        short                    iMaxSockets;
        short                  iMaxUdpDg;
        POINTER                lpVendorInfo;
end;
////////////////////
typedef  HostEnt
begin
        POINTER    ph_name;           
/* official name of host */
        POINTER    ph_aliases;        
/* alias list */
        short      h_addrtype;        
/* host address type */
        short      h_length;          
/* length of address */
        POINTER    ph_addr_list;      
/* list of addresses */
end;   

//////////////////
typedef IPName
 begin
 
STRING szIPAddr[100];
end;
/////////////

typedef IPAddrList
 begin
 POINTER pIPAddr;
end;

/////////////

typedef IPAddPtr
 begin
 
LONG nIPAddr;
end;     
/////////////


prototype POINTER wsock32.gethostbyname(BYREF 
STRING);
prototype POINTER wsock32.gethostname(BYREF 
STRING, NUMBER);
prototype POINTER wsock32.WSAStartup(
INT, POINTER);
prototype POINTER wsock32.inet_ntoa( NUMBER);
prototype POINTER wsock32.WSACleanup();
prototype 
int     wsock32.WSAGetLastError ();   
prototype 
STRING GetLocalIP();  

function STRING GetLocalIP() 
WSAData structWSAData;
WSAData POINTER pWSAData;
//
IPName LocalIPName;
IPName  POINTER pLocalIPName;
//
IPAddrList  structIPAddrList;
IPAddrList  POINTER pIPAddrList;
IPAddPtr  structIPAddPtr;
IPAddPtr  POINTER pIPAddPtr;

POINTER pIN_Addr_Struct;
HostEnt structHostEnt;
HostEnt POINTER pHostEnt;
SHORT nlen;
NUMBER nIPNetAddr;

NUMBER nVersion;
STRING szMsg;
STRING szDefault;
STRING szURL;
STRING szPath;
NUMBER nRC;
NUMBER nRC2;
STRING szHostName;
STRING szMYIPAddr;
POINTER pWinSockReturn;     

begin
    pWSAData 
= &structWSAData;

    nRC 
= UseDLL ("wsock32.dll");
    pWSAData 
-> wHighVersion = 1;
    pWSAData 
-> wVersion     = 1;
    nVersion 
=  0x02000002;   // can be 0x01000001 for Windows NT but Windows 95 requires the version 2 settings

    pWinSockReturn 
= WSAStartup(nVersion, pWSAData);
    pWinSockReturn 
= gethostname(szHostName,100);
    pHostEnt       
= gethostbyname(szHostName);

    nlen         
= pHostEnt   -> h_length;   // debug check (should be 4)
    pIPAddPtr    
= pHostEnt    -> ph_addr_list;
    pIPAddPtr   
= *pIPAddPtr;
    nIPNetAddr  
= *pIPAddPtr;
    
// nIPNetAddr  = pIPAddPtr  -> nIPAddr;
    pLocalIPName 
=  inet_ntoa( nIPNetAddr );
    szMYIPAddr   
=  pLocalIPName -> szIPAddr;
    WSACleanup();  
    UnUseDLL(
"wsock32.dll");
    return   szMYIPAddr;
end;

 

 

转载于:https://www.cnblogs.com/solo/archive/2009/06/18/1505502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值