IPV6与char*字符串类型互相转换

  1. 使用in6_addr和in_addr转化为字符串类型
PCTSTR WSAAPI InetNtop(
  __in   INT  Family,
  __in   PVOID pAddr,
  __out  PTSTR pStringBuf,
  __in   size_t StringBufSize
);

http://msdn.microsoft.com/en-us/library/windows/desktop/cc805843(v=vs.85).aspx

Family = AF_INET (ipv4)

Family = AF_INET6(ipv6)


pAddr = IN_ADDR * (ipv4)

pAddr = IN6_ADDR*(ipv6)


2. 将SOCKADDR转化为字符串

INT WSAAPI WSAAddressToString(
  __in      LPSOCKADDR lpsaAddress,
  __in      DWORD dwAddressLength,
  __in_opt  LPWSAPROTOCOL_INFO lpProtocolInfo,
  __inout   LPTSTR lpszAddressString,
  __inout   LPDWORD lpdwAddressStringLength
);
详细用法:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741516(v=vs.85).aspx



3.示例(获取IPV6地址非fe80地址)

void getLocalIPV6(char *IPAddr)
{
PIP_ADAPTER_ADDRESSES pAddresses;
ULONG outBufLen = 0;
DWORD dwRetVal = 0;
char Hostname[100];
char buff[100];
DWORD bufflen=100;
int addrLen = sizeof(SOCKADDR_STORAGE);
pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(sizeof(IP_ADAPTER_ADDRESSES));
// 第一次使用 GetAdaptersAddresses 从 outBufLen 中获取需要的缓冲区大小
if (GetAdaptersAddresses(AF_INET6, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) 
{
   free(pAddresses);
   pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);
}

// 第二次调用GetAdaptersAddresses 获取实际想获取的信息.
if ((dwRetVal = GetAdaptersAddresses(AF_INET6, 0 , NULL, pAddresses, &outBufLen)) == NO_ERROR) 
{
   PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;
   while (pCurrAddresses) 
   {
    if(pCurrAddresses->FirstUnicastAddress !=NULL)
    {
     WSAAddressToString(pCurrAddresses->FirstUnicastAddress->Address.lpSockaddr,
      pCurrAddresses->FirstUnicastAddress->Address.iSockaddrLength,NULL,buff,&bufflen);
     if (strncmp(buff,"fe80",4)==0||strcmp(buff,"::1") ==0)
     {
     }
     else
     {
      memcpy(IPAddr,buff,bufflen);
      return;
     } 
    }
    pCurrAddresses = pCurrAddresses->Next;
   }
}
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值