我有一个客户端,它通过带有回调的第三方库订阅了多个多播提要。第三方库做这样的事情:
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_addr
的sin_addr.s_addr
内容在哪里?当我测试它时这似乎有效,但我感觉它有时会失败,这可能与临时使用. 这种方法是否不可靠,如果是,是否是检查传入的每个元素的唯一可靠方法?sockaddr_in*
recvfrom
he->h_addr_list
he->h_addr_list
s_addr