【发布时间】:2012-12-24 01:09:24
【问题描述】:
我有一个客户端,它通过带有回调的第三方库订阅了多个多播提要。第三方库做这样的事情:
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 是包含在sockaddr_in* 中的sin_addr.s_addr,我从调用recvfrom 的第三方库中获得。当我测试它时,这似乎有效,但我感觉它有时会失败,这可能与 he->h_addr_list 的第一个元素的临时使用有关。这种方法是否不可靠,如果是,是否是检查he->h_addr_list 的每个元素与传入的s_addr 的唯一可靠方法?
【问题讨论】:
-
如果“我的不同订阅者可能想要不同的行为”,那么您根本没有参与多播,您应该重新审视您的技术选择。
标签: networking network-programming