获取ip地址接口后
int res=PacketGetAdapterNames(AdapterName,&AdapterLength);
根据AdapterName解析出所有网卡接口名称。对于其中的一个strInterfaceName
std::string GetInterfaceIp( const CString& strInterfaceName )
{
/* 查询ip地址 */
npf_if_addr ifAddr[3] = {0};
LONG lEntry = 3;
BOOLEAN bStatus = PacketGetNetInfoEx( strInterfaceName, ifAddr, &lEntry );
//不推荐此方法,除非明确知道是ipv4
// const std::string& strIp =
// DebugDatagram(
// (const unsigned char*)&(((sockaddr_in*)&(ifAddr[0].IPAddress))->sin_addr.S_un.S_addr),
// 4,false,false,".");
char hoststr[NI_MAXHOST];
char portstr[NI_MAXSERV];
// 推荐此函数,可以获取ipv6
getnameinfo((struct sockaddr *)&ifAddr[0].IPAddress,
sizeof(ifAddr[0].IPAddress),
hoststr, sizeof(hoststr),
portstr, sizeof(portstr),
NI_NUMERICHOST | NI_NUMERICSERV );
return hoststr;
}
可能用到的其它调试函数
std::string DebugDatagram( const unsigned char* pData , int nLen,
bool bHex = true,bool bHasIndex = true,const std::string& strSeperator = "," )
{
std::string strFormat;
if( bHasIndex )
{
strFormat += "[%d]=";
}
if( bHex )
{
strFormat += "0x%02X";
}
else
{
strFormat += "%d";
}
strFormat += strSeperator;
std::string strResult;
char szBuffer[32] = {0};
for( int i = 0; i < nLen; ++i )
{
if( bHasIndex )
{
sprintf_s( szBuffer, strFormat.c_str(), i, pData[i] );
}
else
{
sprintf_s( szBuffer, strFormat.c_str(), pData[i] );
}
strResult += szBuffer;
}
return strResult.substr(0,strResult.size() -strSeperator.size() );
}