首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原始套接字侦听器

原始套接字侦听器
EN

Stack Overflow用户
提问于 2012-10-26 14:41:08
回答 2查看 12.2K关注 0票数 5

这是一个关于linux c编程原始套接字的快速问题。如果我只想侦听具有原始套接字的任何接口,我是否必须真正绑定到ip地址或接口才能侦听流量?据我所知,我觉得我应该能够只调用sock();,然后开始recvfrom()流量。也许我错了,但我见过一些不使用它的程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-26 15:29:39

您是对的,您唯一需要做的就是调用socket(),然后调用recvfrom()。不过,请注意,使用SOCK_RAW进行侦听存在一些限制。

如果您不是在“发送并忘记”的基础上使用原始套接字,那么您将有兴趣读取原始数据包的回复数据包。关于分组是否将被递送到原始套接字的判定逻辑可以这样枚举:

ICMP TCP和UDP数据包从不传送到原始套接字,它们始终由内核协议堆栈处理。

  1. 数据包的
  2. 副本传送到匹配的原始套接字。对于某些ICMP类型(ICMP回应请求、ICMP时间戳请求、掩码请求),内核可能同时希望进行一些处理并生成回复。
  3. 所有IGMP数据包都被传送到原始套接字:例如,OSPF数据包。
  4. 所有其他去往未被内核子系统处理的协议的数据包都被传送到原始套接字。

您正在处理的协议将应答包传递到您的原始套接字,这并不一定意味着您将获得应答包。为此,您可能还需要考虑:

  1. 在通过socket (2)系统调用创建套接字时相应地设置协议。例如,如果您正在发送ICMP echo-request包,并且想要接收ICMP echo-reply,您可以将协议参数(第三个参数)设置为IPPROTO_ICMP).
  2. setting (2)中的协议参数为0,这样接收到的数据包报头中的任何协议编号都将绑定您套接字的本地地址(例如,通过match.
  3. defining (2)),因此如果目标地址与套接字的本地地址匹配,它也会被传送到您的应用程序。

有关更多详细信息,请阅读this

票数 14
EN

Stack Overflow用户

发布于 2012-10-26 14:44:13

如果您打算捕获接口上的流量,则可以使用libpcap。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13082023

复制
相关文章

相似问题

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