这是linux c编程原始套接字的快速问题。如果我只想听一个带有原始套接字的接口,我是否必须实际绑定到ip地址或接口来监听流量?根据我的理解,我觉得我应该能够只调用sock();然后启动recvfrom()流量。也许我错了,但我看到一些不使用它的程序。
答案 0 :(得分:10)
你是对的,你唯一需要做的就是打电话给socket()
然后再打recvfrom()
。尽管如此,请注意使用SOCK_RAW
进行收听时存在一些限制。
如果你没有在“发送 - 忘记”的基础上使用原始套接字,你会的 有兴趣阅读原始数据包的回复数据包。 数据包是否将被传送到原始数据的决策逻辑 套接字可以这样设置:
TCP和UDP数据包永远不会传递到原始套接字,它们总是由内核协议栈处理。
ICMP数据包的副本将传递到匹配的原始套接字。对于某些ICMP类型(ICMP回应请求,ICMP时间戳请求, 掩码请求)内核,同时,可能希望做一些 处理并生成回复。
所有IGMP数据包都传送到原始套接字:例如OSPF数据包。
- 醇>
发往未经内核子系统处理的协议的所有其他数据包都将传送到原始套接字。
您正在处理回复数据包的协议 交付到你的原始套接字并不一定意味着你 得到回复包。为此,您可能还需要考虑:
通过socket(2)系统调用创建套接字时相应地设置协议。例如,如果您要发送ICMP echo-request包,想要接收ICMP echo-reply,可以设置 IPPROTO_ICMP的协议参数(第三个参数)。
将socket(2)中的protocol参数设置为0,因此接收到的数据包头中的任何协议号都将匹配。
- 醇>
定义套接字的本地地址(通过例如bind(2)),所以如果目标地址与套接字的本地地址匹配,它将是 也送到你的申请表。
有关详细信息,请参阅例如this
答案 1 :(得分:1)
如果您想捕获接口上的流量,可以使用libpcap。