rust - 有什么比在原始套接字上使用 libc 来实现任意协议更好的呢?
问题描述
crate 是 libc的nix
一个很好的包装器,用于处理原始套接字,但事实证明它只支持这些原始套接字上的 TCP 和 UDP 协议。例如,我想在原始套接字上使用 ICMP——例如,我想sendto
与 ICMP 数据包一起使用,并在进入网络之前将其包装在 IP 标头 + 以太网标头中,就像使用标准的 libc 函数。是否有任何包装器/板条箱支持这一点,而无需我自己做丑陋的 FFI 东西?如果有一种使用方法getprotobyname
或与 nix 类似的方法,那就太好了。
解决方案
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);
推荐阅读
- amazon-s3 - 将文件从 SFTP 复制到 S3(增量上传)
- javascript - LitElement 中的自定义属性访问器
- mysql - 获取用户特定数据和查询的最快方法是什么?
- javascript - 使用 Typeorm 从 Postgres 数据库返回 ROW_NUMBER()
- c++ - 是否可以在 OpenGL 的同一个调用中渲染两个具有不同索引起点的不同缓冲区?
- node.js - 如何在 Heroku 托管的 Web 应用程序上上传/访问联系表单的 .env 文件?
- python - UnicodeEncodeError:在 python 中使用 to_sql 时
- python - 新数据框,其中包含在付款当月支付的债务百分比
- python - 如何在 Linux 中为 Google Cloud 设置 CLOUDSDK_PYTHON?
- python - GluonTS DeepAR 预测非确定性