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() );
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值