首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过sockaddr_in*检测数据包是否来自本地主机

通过sockaddr_in*检测数据包是否来自本地主机
EN

Stack Overflow用户
提问于 2012-12-24 09:09:25
回答 2查看 320关注 0票数 2

我有一个客户端,它通过带有回调的第三方库订阅了几个多播源。第三方库执行以下操作:

代码语言:javascript
复制
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验证它们不是本地消息时才移交它们。

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

代码语言:javascript
复制
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类型的成员变量。然后,当我从网络侦听器得到上面描述的回调时,我会这样做:

代码语言:javascript
复制
//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的每个元素

EN

Stack Overflow用户

发布于 2015-03-30 16:48:35

抱歉,但不知何故,我看不到0x10107f对应于127.0.0.1...不是应该是0x0100007F吗?

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14016031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档