原始套接字监听器

Dr.*_*all 3 c sockets linux network-programming

这是linux c编程原始套接字的一个快速问题.如果我只想听一个带有原始套接字的接口,我是否必须实际绑定到ip地址或接口来监听流量?根据我的理解,我觉得我应该能够只调用sock(); 然后启动recvfrom()流量.也许我错了,但我看过一些不使用它的程序.

cod*_*ior 11

你是对的,你唯一需要做的就是打电话socket()然后recvfrom().尽管如此,请注意使用听力有一些限制SOCK_RAW.

如果您没有在"发送 - 忘记"的基础上使用原始套接字,您将有兴趣阅读原始数据包的回复数据包.关于是否将数据包传递到原始套接字的决策逻辑可以如下所示:

  1. TCP和UDP数据包永远不会传递到原始套接字,它们总是由内核协议栈处理.

  2. ICMP数据包的副本将传递到匹配的原始套接字.对于某些ICMP类型(ICMP回应请求,ICMP时间戳请求,掩码请求),内核同时可能希望进行一些处理并生成回复.

  3. 所有IGMP数据包都传送到原始套接字:例如OSPF数据包.

  4. 发往未由内核子系统处理的协议的所有其他数据包将传递到原始套接字.

您正在处理将回复数据包传递到原始套接字的协议这一事实并不一定意味着您将获得回复数据包.为此,您可能还需要考虑:

  1. 通过socket(2)系统调用创建套接字时相应地设置协议.例如,如果您要发送ICMP echo-r​​equest数据包,并且想要接收ICMP echo-r​​eply,则可以将protocol参数(第3个参数)设置为IPPROTO_ICMP.

  2. 将socket(2)中的protocol参数设置为0,因此接收到的数据包头中的任何协议号都将匹配.

  3. 定义套接字的本地地址(通过例如bind(2)),因此如果目标地址与套接字的本地地址匹配,它也将被传送到您的应用程序.

有关详细信息,请阅读此内容.