私の最初の賭けはGetIpAddrTable()
サンプルコードがあったので、それはIPv4しかサポートしていません。それから私は試し GetAdaptersInfo()
ましたが、ドキュメントはそれがによって廃止されていることを示唆していGetAdaptersAddresses()
ます。GetAdaptersAdresses()またはその他のIPヘルパーAPIを使用してネットマスクを取得するためのコードサンプルを使用する必要がありますか?
質問する
949 次
1 に答える
1
IPv4の場合、AF_INETソケットとSIO_GET_INTERFACE_LISTフラグを使用してWSAIoctlを呼び出すことができます。これにより、IP、ネットマスク、およびブロードキャストアドレスのセットを含むINTERFACE_INFO構造体の配列が返されます。以下のサンプルコードを参照してください。
IPv6の場合、「ネットマスク」の概念はIPv4の場合と同じようには適用されません。 詳細については、こちらをご覧ください。コマンドラインから「ipconfig」と入力するか、コントロールパネルからIPv6アドレスを手動で設定しようとすると、「ネットマスク」フィールドが表示されないことに気づきましたか?
したがって、IPv4インターフェイスのネットマスクにはSIO_GET_INTERFACE_LISTまたはGetIpAddrTableを使用できます。ただし、IPv6の場合は、その情報を使用して実際に何をしようとしているのかを詳しく説明する必要があります。
int _tmain(int argc, _TCHAR* argv[])
{
WSAData data = {};
sockaddr_in addrLocal = {};
INTERFACE_INFO infolist[100] = {};
DWORD dwBytesReturned = 0;
DWORD dwNumInterfaces = 0;
::WSAStartup(MAKEWORD(2,2), &data);
int s = socket(AF_INET, SOCK_DGRAM, 0);
int result = WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, (void*)infolist, sizeof(infolist), &dwBytesReturned, NULL, NULL);
dwNumInterfaces = dwBytesReturned / sizeof(INTERFACE_INFO);
for (DWORD index = 0; index < dwNumInterfaces; index++)
{
char szIP[120]={};
char szBroadcast[120]={};
char szNetMask[120]={};
if (infolist[index].iiAddress.Address.sa_family == AF_INET)
{
// ipv4
sockaddr_in* pAddr4 = &infolist[index].iiAddress.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szIP, ARRAYSIZE(szIP));
pAddr4 = &infolist[index].iiBroadcastAddress.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szBroadcast, ARRAYSIZE(szBroadcast));
pAddr4 = &infolist[index].iiNetmask.AddressIn;
inet_ntop(AF_INET, &pAddr4->sin_addr, szNetMask, ARRAYSIZE(szNetMask));
}
else
{
continue;
}
printf("IP:%s NetMask:%s Broadcast:%s\n", szIP, szNetMask, szBroadcast);
}
return 0;
}
于 2013-01-03T09:29:39.840 に答える