2

我有一个客户端,它通过带有回调的第三方库订阅了多个多播提要。第三方库做这样的事情:

sockaddr_in senderAddr;
socklen_t len = sizeof(struct sockaddr_in);
for fd in allMulticastFeeds:
{
    recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&senderAddr, &len);    
    (*func)(buf, rc, &senderAddr, 0, stuff*);
}

有几个听众订阅了我,我的工作是解析 buf 中包含的消息并回调订阅我的适当客户端。订阅我的客户给我的选项之一是他们是否想要接收从本地主机传出的消息。因为我的不同订阅者可能想要不同的行为,所以我根本无法将其转换为禁用多播,我必须为每个客户端检查他或她是否请求本地消息,如果没有,则只有在我可以验证的情况下才将其移交给sockaddr_in他们不是本地的。

我这样做的方法是在我的服务的构造函数中执行以下操作:

sockaddr_in self;
hostent *he;
char local[HOST_NAME_MAX];
gethostname(local, sizeof(local));
he = gethostbyname(local);

if (he)
{
    memcpy(&self.sin_addr, he->h_addr_list[0], he->h_length);
    selfAddr_ = self.sin_addr.s_addr;
}

其中selfAddr_是类型的成员变量long。然后,当我从网络侦听器获得上述回调时,我会执行以下操作:

//code to get the correct listener for this type of packet after parsing it
if (listener->AskedForLocal || selfAddr_ != s_addr)
    listener->onFoo(bla,bla);

我从第三方库调用中获得s_addrsin_addr.s_addr内容在哪里?当我测试它时这似乎有效,但我感觉它有时会失败,这可能与临时使用. 这种方法是否不可靠,如果是,是否是检查传入的每个元素的唯一可靠方法?sockaddr_in*recvfromhe->h_addr_listhe->h_addr_lists_addr

4

2 回答 2

0

查看服务的构造函数并在作为 virtualbox 映像运行的 Ubuntu 10.04 LTS 上尝试我得到 selfAddr_ = 0x10107f 这对应于环回地址 127.0.0.1

这可能不是您要查找的内容-我怀疑您可能在寻找特定网络接口的 IP 地址,如果是这样,请尝试此答案

希望这可以帮助。

于 2013-03-14T18:17:50.517 回答
0

抱歉,但不知何故,我没有看到对应于 127.0.0.1 的 0x10107f ... 那不应该是 0x0100007F ...

于 2015-03-30T08:48:34.907 回答