我有一个客户端,它通过带有回调的第三方库订阅了几个多播源。第三方库执行以下操作:
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是包含在我从调用recvfrom的第三方库中获得的sockaddr_in*中的sin_addr.s_addr。当我测试它时,这似乎是有效的,但我有一种感觉,它有时会失败,这可能与临时使用he->h_addr_list的第一个元素有关。此方法是否不可靠,如果是,则是唯一可靠的方法,可以根据传入的s_addr检查he->h_addr_list的每个元素
发布于 2015-03-30 16:48:35
抱歉,但不知何故,我看不到0x10107f对应于127.0.0.1...不是应该是0x0100007F吗?
https://stackoverflow.com/questions/14016031
复制相似问题