首页 > 解决方案 > 有什么比在原始套接字上使用 libc 来实现任意协议更好的呢?

问题描述

crate 是 libc的nix一个很好的包装器,用于处理原始套接字,但事实证明它只支持这些原始套接字上的 TCP 和 UDP 协议。例如,我想在原始套接字上使用 ICMP——例如,我想sendto与 ICMP 数据包一起使用,并在进入网络之前将其包装在 IP 标头 + 以太网标头中,就像使用标准的 libc 函数。是否有任何包装器/板条箱支持这一点,而无需我自己做丑陋的 FFI 东西?如果有一种使用方法getprotobyname或与 nix 类似的方法,那就太好了。

标签: rustnetwork-programming

解决方案


Rust 标准库目前没有原始套接字功能。现有的最低级别的网络库是直接 FFI 到libpcap. 如果您想通过标准库使用除 TCP 或 UDP 之外的任何协议,您必须自己实现它或查看pnet是否已经完成。

使用pcap

let mut handle = Device::lookup().unwrap().open().unwrap();

let data = &[0, 1, 2, 3, 5];

handle.sendpacket(data);

推荐阅读