获取本地ip地址ip地址自动获取


两种方法都是通过先得到主机名再获取IP地址:puter.intgethostname(char*name,intnamelen);Parametersname[out]Pointertoabufferthatreceivesthelocalhostname.namelen[in]Lengthofthebuffer,inbytescharhostname[50];gethostname(hostname,50);即可得到主机名。有了主机名下一步就是获取IP地址,方法一是通过API函数gethostbyname,需要注意的事这个函数仅仅适用于IPv4,该函数再MSDN中的注释如下:Thegethostbynamefunctionretrieveshostinformationcorrespondingtoahostnamefromahostdatabase.NoteThegethostbynamefunctionhasbeendeprecatedbytheintroductionofthegetaddrinfofunction.DeveloperscreatingWindowsSockets2applicationsareurgedtousethegetaddrinfofunctioninsteadofgethostbyname.structhostent*FARgethostbyname(constchar*name);通过传递主机名得到的返回值是一个hosten结构体指针,typedefstructhostent{charFAR*h_name;charFARFAR**h_aliases;shorth_addrtype;shorth_length;charFARFAR**h_addr_list;}hostent;我们需要使用其中的h_addr_list,通过LPCSTRpszIP=_ntoa(*(structin_addr*)pHost->h_addr_list[0);即可得到IP地址,注意h_addr_list是主机地址列表,我们这里取的事第一个值,有的电脑装有多个网卡可能有多个IP地址。方法二是通过API函数getaddrinfo,通过上面的注释也可以看出MS推荐我们使用这个函数代gethostbyname,因为这个函数既适用于IPv4也适用于IPv6,详见MSDN。Thegetaddrinfofunctionprovidesprotocol-independenttranslationfromhostnametoaddress.intgetaddrinfo(constTCHAR*nodename,constTCHAR*servname,conststructaddrinfo*hints,structaddrinfo**res);Parametersnodename[in]Pointertoanull-terminatedstringcontainingahost(node)nameoranumerichostaddressstring.Thenumerichostaddressstringisadotted-decimalIPv4addressoranIPv6hexaddress.servname[in]Pointertoanull-terminatedstringcontainingeitheraservicenameorportnumber.hints[in]Pointertoanaddrinfostructurethatprovideshintsaboutthetypeofsocketthecallersupports.SeeRemarks.res[out]PointertoalinkedlistofoneormoreaddrinfostructurescontainingresponseinformationaboutthehostMSDN说这个函数是用来提供一种与协议无关的主机名转换为地址的方法,参照MSDN上面的例子经过试验得出下面获取IP的方法:gethostname(hostname,100);//获得主机的名称getaddrinfo(hostname,NULL,