- 使用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;
}
}
}