struct sockaddr_storage 转换为ip字符串

获取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() );
}
发布了56 篇原创文章 · 获赞 18 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/iMatt/article/details/102720742