(私はあなたがWindows上で作業している前提としています)
GetIpAddrTableはまさにその!すべてのネットワークインターフェイスに関するデータを返します.IPアドレスはその中にあります。それらを手に入れるにはいくつかのトリッキーがありますが、Winsockの残りの部分ではありません。
ここでは、IP回線マスクとネットワークマスクを使用してすべてのネットワークインターフェイスを印刷し、ローカルコールバック(127.0.0.1)のフィルタを作成する準備ができている54行の例を示します。いつもそこに、あなたはそれを無視することはできませんので:私のマシン上でこの出力を生成する
#include "stdio.h"
#include "Winsock2.h"
#include "Iphlpapi.h"
int main(){
int error;
ULONG size = 0;
MIB_IPADDRTABLE* meta_table = nullptr;
error = GetIpAddrTable(meta_table, &size, false);
if(error != ERROR_INSUFFICIENT_BUFFER)
return -1;
meta_table = (MIB_IPADDRTABLE*)malloc(size);
error = GetIpAddrTable(meta_table, &size, false);
if(error != NO_ERROR)
return -1;
int os_interface_count = meta_table->dwNumEntries;
for(int i = 0; i < os_interface_count; i++){
printf("interface:\n");
{
in_addr mask;
in_addr address;
address.S_un.S_addr = meta_table->table[i].dwAddr;
mask.S_un.S_addr = meta_table->table[i].dwMask;
printf("index: %d\n", meta_table->table[i].dwIndex);
printf("address: %s\n", inet_ntoa(address));
printf("mask: %s\n", inet_ntoa(mask));
}
{
in_addr callback_address;
callback_address.S_un.S_un_b.s_b1 = 127;
callback_address.S_un.S_un_b.s_b2 = 0;
callback_address.S_un.S_un_b.s_b3 = 0;
callback_address.S_un.S_un_b.s_b4 = 1;
if(meta_table->table[i].dwAddr == callback_address.S_un.S_addr)
printf("local callback!\n");
}
}
free(meta_table);
return 0;
}
(MSVC 19、窓10、Iphlpapi.libとWS2_32.LIBに対するリンクで働いていた):
interface:
index: 7
address: 192.168.56.1
mask: 255.255.255.0
interface:
index: 1
address: 127.0.0.1
mask: 255.0.0.0
local callback!
interface:
index: 11
address: 192.168.178.181
mask: 255.255.255.0
奇妙なことは、GetIpAddrTable
への最初の呼び出しで、バッファーに割り当てる必要があるサイズだけです。私はコードの残りの部分はかなり自明であると思う、私は質問のためにここにいる。 (私は50議員がいないので、私は質問に返信することができるかどうかわからない、ありがとうStackoverflow!)
なぜmDNS(マルチキャストDNS)などの既存のソリューションを活用していないのですか? – jldupont
mDNSは私のニーズには複雑すぎます。 – laura