DWORD pGetIPv6Addr(DWORD cbBuffer, LPBYTE lpbBuffer) { // // BUGBUG: // Does not seem to be working. Should be fixed later // After fix this function, add to the procTable in pGetHostInfo() // static const INET6_ADDRESS_LEN = 16 * sizeof(UCHAR); AutoSocket s = ::WSASocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0); if (INVALID_SOCKET == s) { return 0; } LPSOCKET_ADDRESS_LIST pAddrList = pCreateSocketAddressList(s); if (NULL == pAddrList) { return 0; } AutoHLocal hLocal = (HLOCAL) pAddrList; DWORD cbUsed = 2; if (cbBuffer < cbUsed) { return 0; } PUCHAR pucCount = lpbBuffer; ++lpbBuffer; PUCHAR pucAddressLen = lpbBuffer; ++lpbBuffer; *pucAddressLen = INET6_ADDRESS_LEN; *pucCount = 0; for (DWORD i = 0; i < pAddrList->iAddressCount && cbUsed + INET6_ADDRESS_LEN <= cbBuffer; ++i) { PSOCKADDR_IN pSockAddr = (PSOCKADDR_IN) pAddrList->Address[i].lpSockaddr; ::CopyMemory( lpbBuffer, &pSockAddr->sin_addr, INET6_ADDRESS_LEN); ++(*pucCount); cbUsed += INET6_ADDRESS_LEN; lpbBuffer += INET6_ADDRESS_LEN; } return cbUsed; }
LPSOCKET_ADDRESS_LIST pCreateLocalLpxAddressList() { AutoSocket sock = ::WSASocket( AF_LPX, SOCK_DGRAM, LPXPROTO_DGRAM, NULL, 0, 0); if (INVALID_SOCKET == sock) { return NULL; } return pCreateSocketAddressList(sock); }
DWORD pGetLpxAddr(DWORD cbBuffer, LPBYTE lpbBuffer) { static const LPX_ADDRESS_LEN = 6 * sizeof(UCHAR); AutoSocket s = ::WSASocket(AF_LPX, SOCK_DGRAM, LPXPROTO_DGRAM, NULL, 0, 0); if (INVALID_SOCKET == s) { return 0; } LPSOCKET_ADDRESS_LIST pAddrList = pCreateSocketAddressList(s); if (NULL == pAddrList) { return 0; } AutoHLocal hLocal = (HLOCAL) pAddrList; DWORD cbUsed = 2; if (cbBuffer < cbUsed) { return 0; } PUCHAR pucCount = lpbBuffer; ++lpbBuffer; PUCHAR pucAddressLen = lpbBuffer; ++lpbBuffer; *pucAddressLen = LPX_ADDRESS_LEN; *pucCount = 0; for (DWORD i = 0; i < pAddrList->iAddressCount && cbUsed + LPX_ADDRESS_LEN <= cbBuffer; ++i) { PSOCKADDR_LPX pSockAddrLpx = (PSOCKADDR_LPX) pAddrList->Address[i].lpSockaddr; ::CopyMemory( lpbBuffer, &pSockAddrLpx->LpxAddress.Node[0], LPX_ADDRESS_LEN); ++(*pucCount); cbUsed += LPX_ADDRESS_LEN; lpbBuffer += LPX_ADDRESS_LEN; } return cbUsed; }
DWORD pGetIPv4Addr(DWORD cbBuffer, LPBYTE lpbBuffer) { static const INET_ADDRESS_LEN = 4 * sizeof(UCHAR); AutoSocket s = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0); if (INVALID_SOCKET == s) { return 0; } LPSOCKET_ADDRESS_LIST pAddrList = pCreateSocketAddressList(s); if (NULL == pAddrList) { return 0; } AutoHLocal hLocal = (HLOCAL) pAddrList; DWORD cbUsed = 2; if (cbBuffer < cbUsed) { return 0; } PUCHAR pucCount = lpbBuffer; ++lpbBuffer; PUCHAR pucAddressLen = lpbBuffer; ++lpbBuffer; *pucAddressLen = INET_ADDRESS_LEN; *pucCount = 0; for (DWORD i = 0; i < pAddrList->iAddressCount && cbUsed + INET_ADDRESS_LEN <= cbBuffer; ++i) { PSOCKADDR_IN pSockAddr = (PSOCKADDR_IN) pAddrList->Address[i].lpSockaddr; ::CopyMemory( lpbBuffer, &pSockAddr->sin_addr, INET_ADDRESS_LEN); ++(*pucCount); cbUsed += INET_ADDRESS_LEN; lpbBuffer += INET_ADDRESS_LEN; } return cbUsed; }