有关以下我假设一个网卡。

我有我的计划,其目的是让别人在它存在的子网知道的一个组成部分。对于这一点,我已经实现,其中当程序启动时(并定期此后),它发送一个广播INADDR_BROADCAST的解决方案 - 谁需要的端口上侦听会记住它供以后使用就来了。

这样做的问题是,我不想记得我自己的广播节目。我认为,从理论上讲,这将是很容易做到 - 只要找出本地IP,并比较你recvfrom得到什么。

不过,我发现它很难得到本地IP:getaddrinfo与返回NULL 127.0.0.1getaddrinfo与主机返回公网IP。任何人都可以点我在寻找实际的IP子网的方向是什么?我想我必须在这里失去了一些东西很明显,但好...我仍然失踪了:)

请注意:我读过其他的节目做题,尤其是这一个: UDP-播出,但我还没有得到全面的多接口问题尚未所有接口。

有帮助吗?

解决方案

那么在启动时,你可以播放与随机的(但跟踪)值不同的消息,然后等待消息时,发现自己的地址,从此,您可发送普通短信,无视你的采购信息。

其他提示

getsockname功能文档)可以发现本地IP地址与特定套接字关联。如果调用此您使用的是发送广播插座上,你会看到你会看到recvfrom返回相同的IP地址。

在Linux中,你可以用ioctl与SIOCGIFADDR选项指定接口的IP地址。我不认为这适用于Windows,虽然。对于这一点,你必须做这样的一些愚蠢的。

搜索SCOKET选项,看看是否这些作品: IP_MULTICAST_LOOP,IP_BLOCK_SOURCE

(我假设你是在Windows上工作)

GetIpAddrTable 正是如此!它返回的数据对你所有的网络接口,IP地址是其中之一。有一些挂羊头卖狗肉在得到他们,但不低于Winsocks其余多。

下面是一个准备编译,打印您的所有网络接口IP和网络掩码54线为例,还筛选了当地的回调(127.0.0.1),因为你很可能不希望这样,它始终是在那里,所以你不能忽略它:

(用MSVC 19,窗10,连杆对Iphlpapi.lib和WS2_32.LIB工作)

#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;
}

我的机器上生产这种输出:

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声誉,所以我不知道如果我将能够回答的问题,谢谢#1!)

scroll top