首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

007 Rust 网络编程,libpnet 库介绍

pnet

libpnet为Rust提供一组跨平台的底层网络API。

依赖

[dependencies]

pnet = "0.25.0"

源码示例

use pnet::datalink::Channel::Ethernet;

use pnet::datalink::;

use pnet::packet::ethernet::;

use pnet::packet::ip::IpNextHeaderProtocols;

use pnet::packet::ipv4::Ipv4Packet;

use pnet::packet::tcp::TcpPacket;

use pnet::packet::Packet;

use std::env;

fn handle_packet(ethernet: &EthernetPacket) {

// 对Ipv4的包按层解析

match ethernet.get_ethertype() {

EtherTypes::Ipv4 => {

let header = Ipv4Packet::new(ethernet.payload());

if let Some(header) = header {

match header.get_next_level_protocol() {

IpNextHeaderProtocols::Tcp => {

let tcp = TcpPacket::new(header.payload());

if let Some(tcp) = tcp {

println!(

"Got a TCP packet {}:{} to {}:{}",

header.get_source(),

tcp.get_source(),

header.get_destination(),

tcp.get_destination()

);

}

}

_ => println!("Ignoring non TCP packet"),

}

}

}

_ => println!("Ignoring non IPv4 packet"),

}

}

fn main() {

let interface_name = env::args().nth(1).unwrap();

// 获取网卡列表

let interfaces = datalink::interfaces();

let interface = interfaces

.into_iter()

.filter(|iface: &NetworkInterface| iface.name == interface_name)

.next()

.expect("Error getting interface");

let (_tx, mut rx) = match datalink::channel(&interface, Default::default()) {

Ok(Ethernet(tx, rx)) => (tx, rx),

Ok(_) => panic!("Unhandled channel type"),

Err(e) => panic!(

"An error occurred when creating the datalink channel: {}",

e

),

};

loop {

// 获取收到的包

match rx.next() {

Ok(packet) => {

let packet = EthernetPacket::new(packet).unwrap();

handle_packet(&packet);

}

Err(e) => {

panic!("An error occurred while reading: {}", e);

}

}

}

}

运行:

sudo cargo run 网卡名字  //例子:sudo cargo run enp0s3

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200425A0OB8E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券