首页 > 其他分享 >0216-跨网卡通信

0216-跨网卡通信

时间:2024-08-12 09:16:08浏览次数:13  
标签:00 通信 pnet 网卡 let ff 0216 channel

环境

  • Time 2022-11-20
  • VirtualBox 7.0.2
  • Rust 1.65.0
  • pnet 0.31.0
  • CentOS 7

前言

说明

参考:https://docs.rs/pnet_packet/latest/pnet_packet/index.html

目标

使用虚拟机,启动 CentOS 系统,然后添加多块网卡进行通信。

查看网卡

[root@centos7 ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:93:92:f2 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:16:d2:3f brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:de:8a:c8 brd ff:ff:ff:ff:ff:ff

其中的 enp0s8 和 enp0s9 是新增的两块网卡。

reader.rs

use pnet_datalink::{channel, Channel};
fn main() {
    let interface = pnet_datalink::interfaces()
        .into_iter()
        .find(|iface| iface.name == "enp0s9")
        .unwrap();

    let channel = channel(&interface, Default::default());
    let (mut _sender, mut reader) = match channel {
        Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
        _ => panic!("Not a valid channel returned"),
    };

    loop {
        let buf = reader.next().unwrap();
        println!("{:?}", buf);
    }
}

sender.rs

use pnet_datalink::{channel, Channel};
use pnet_packet::ethernet::{EtherTypes, MutableEthernetPacket};

fn main() {
    let interface = pnet_datalink::interfaces()
        .into_iter()
        .find(|iface| iface.name == "enp0s8")
        .unwrap();

    let channel = channel(&interface, Default::default());
    let (mut sender, mut _reader) = match channel {
        Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
        _ => panic!("Not a valid channel returned"),
    };

    let mut buffer = [0; 14];
    let mut packet = MutableEthernetPacket::new(&mut buffer).unwrap();

    // 这个是 enp0s9 的 MAC 地址
    let dest = "08:00:27:de:8a:c8".parse().unwrap();
    packet.set_destination(dest);
    packet.set_source(interface.mac.unwrap());
    packet.set_ethertype(EtherTypes::Ipv4);

    sender.send_to(&buffer, None).unwrap().unwrap();
}

enp0s8 的抓包

19:45:54.608688 08:00:27:16:d2:3f > 08:00:27:de:8a:c8, ethertype IPv4 (0x0800), length 14: [|ip]

enp0s9 的抓包

19:45:54.609010 08:00:27:16:d2:3f > 08:00:27:de:8a:c8, ethertype IPv4 (0x0800), length 60: IP0

从这里看,两个包的内容基本一样,跨网卡的时候,数据帧信息的长度从 14 变成了 60。

总结

在数据链路层上,通过 pnet,实现了两块网卡之间的通信,数据链路层的通信只需要 MAC 地址。

附录

标签:00,通信,pnet,网卡,let,ff,0216,channel
From: https://www.cnblogs.com/jiangbo4444/p/18354332

相关文章

  • 0217-同网段跨主机通信
    环境Time2022-11-20VirtualBox7.0.2Rust1.65.0pnet0.31.0CentOS7前言说明参考:https://docs.rs/pnet_packet/latest/pnet_packet/index.html目标使用两台虚拟机,启动CentOS系统,然后进行跨主机的通信。主机1网卡[root@centos7~]#hostnamecentos7[root@cento......
  • 进程间通信IPC
    前言        进程是操作系统中独立运行的程序单元,每个进程拥有自己的内存空间。由于进程之间的内存空间是隔离的,不能直接访问彼此的内存,因此需要借助IPC来实现进程间的数据交换一.管道进程间通信的本质是让不同的进程看到同一份资源, 我们先来看管道是如何做到的......
  • 飞腾D2000网卡经裕太PHY后出光网调试指导
    1、背景介绍飞腾D2000网卡经裕太8521后转光模块输出,示意框图如下2、硬件配置裕太8521模式需要配置为RGMII转UTP/Fiber,寄存器中0xa001说明如下,寄存器最后三位读出来是0103、软件配置1)设备树配置linux下对D2000网卡的设备树描述如下,注意要去除网卡节点下面的mdio相关......
  • 一文搞懂通信原理:从消息符号到信号波形
    通信原理1.信息论基础1.1信息、信号、消息1.2信息的度量2.通信系统2.1仙农通信系统模型2.2数字通信系统2.3信号2.4消息、字符、比特、码元、数字波形2.5信息速率与码元速率3.信源编码与信道编码3.1信源编码3.2信道编码4.数字信号传输4.1基带传输4.2频......
  • Java工具类封装微服务间HTTP通信
    在微服务架构中,服务之间通常通过HTTP协议进行通信。为了简化这一过程,我们可以创建一些工具类来封装HTTP请求的发送逻辑。本篇文章将介绍如何使用Java来创建这样的工具类,并分别演示使用ApacheHttpClient和SpringFramework中的RestTemplate来发送HTTPGET请求的方法。1.引言......
  • 通信编码揭秘:(二)信道编码(汉明码、循环冗余校验码、里德所罗门码)与其应用
    通信编码揭秘:2.信道编码(汉明码、循环冗余校验码、里德所罗门码)与其应用摘要信道编码的目的是提高数据传输的可靠性,确保即使在噪声环境下传输的数据也能被正确接收。本文将探讨汉明码、循环冗余校验(CRC)和里德-所罗门码三种常见的信道编码方法,并通过实际例子说明它们的应用......
  • 【无人机通信】K-means聚类和粒子群优化最大限度地覆盖无人机辅助地面设备地面区域和
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • select多路复用(tcp通信)
    文章目录项目名称项目结构项目名称io_demo1项目结构$tree.├──build├──CMakeLists.txt├──debug.gdb├──include│├──mysocket.h│├──tcp_client.h│└──tcp_server.h├──sources│└──server.cpp└──sr......
  • 计算属性-监听属性,生命周期,组件,组件通信之父传子,组件通信之子传父,ref属性
    Ⅰ计算属性-监听属性【一】计算属性:computed#1本质是一个函数,但是当属性用 计算属性是基于它们的依赖进行缓存的计算属性只有在它的相关依赖发生改变时才会重新求值计算属性就像Python中的property,可以把方法/函数伪装成属性#2计算属性和普通函数的区别 ......
  • 【IO】IPC通信机制函数(消息队列,共享内存,信号量集函数整理汇总)
            整理了一下IPC通信的函数,包括消息队列,共享内存,信号量集;信号量集的使用是在共享内存的基础上使用,函数太多啦,慢慢学吧cc,争取全部记住        其中在使用有关信号量集的函数的时候,进行简单的封装函数功能之后,再进行使用,会更加方便,在文章最后对信号量集的......