Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 原始套接字侦听器_C_Linux_Sockets_Network Programming - Fatal编程技术网

C 原始套接字侦听器

C 原始套接字侦听器,c,linux,sockets,network-programming,C,Linux,Sockets,Network Programming,这是一个关于LinuxC编程原始套接字的快速问题。如果我只想监听任何带有原始套接字的接口,我必须绑定到ip地址或接口来监听流量吗?据我所知,我觉得我应该可以直接调用sock();然后启动recvfrom()通信。也许我错了,但我见过一些不使用它的程序。如果你想在接口上捕获流量,你可以使用libpcap。你是对的,你唯一需要做的就是调用socket(),然后调用recvfrom()。不过,请注意,使用SOCK\u RAW进行监听有一些限制 如果您不是在“发送并忘记”的基础上使用原始套接字,那么您将

这是一个关于LinuxC编程原始套接字的快速问题。如果我只想监听任何带有原始套接字的接口,我必须绑定到ip地址或接口来监听流量吗?据我所知,我觉得我应该可以直接调用sock();然后启动recvfrom()通信。也许我错了,但我见过一些不使用它的程序。

如果你想在接口上捕获流量,你可以使用libpcap。

你是对的,你唯一需要做的就是调用
socket()
,然后调用
recvfrom()
。不过,请注意,使用
SOCK\u RAW
进行监听有一些限制

如果您不是在“发送并忘记”的基础上使用原始套接字,那么您将 有兴趣阅读原始数据包的回复数据包。 是否将数据包交付给原始数据包的决策逻辑 套接字可以按如下方式枚举:

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

  • ICMP数据包的副本被传送到匹配的原始套接字。对于某些ICMP类型(ICMP回显请求、ICMP时间戳请求、, 掩码请求)内核,同时,可能希望做一些 处理和生成回复

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

  • 未经内核子系统处理的所有其他发送到协议的数据包都被发送到原始套接字

  • 事实上,您正在处理一个协议,该协议的回复数据包 传送到原始套接字并不一定意味着您将 获取回复包。为此,您可能还需要考虑:

  • 通过socket(2)系统调用创建套接字时,相应地设置协议。例如,如果您正在发送ICMP 回显请求数据包,并希望接收ICMP回显回复,可以设置 IPPROTO_ICMP的协议参数(第三个参数)

  • 将套接字(2)中的协议参数设置为0,以便接收到的数据包头中的任何协议号都将匹配

  • 为套接字定义本地地址(例如通过bind(2)),因此如果目标地址与套接字的本地地址匹配,则 也已发送到您的应用程序


  • 有关更多详细信息,您可以阅读,例如:

    100万谢谢!:)我找不到任何关于在原始套接字上接收数据包的好信息,但再次感谢您的启发。现在我知道如果我想进入原始套接字,我应该使用bpf。很好的答案。最后一个链接目前不可用(可能只是暂时的?),但在镜像。感谢您的建议,我可能会使用libpcap而不是bpf,因为它似乎更容易分析数据包。今天我学到了一些东西!