tokio::net学习

news2024/11/28 12:42:21

tokio::net

该模块包含TCP/UDP/Unix网络类型,类似于标准库,可用于实现网络协议。
networking protocols

Organization

TcpListener and TcpStream provide functionality for communication over TCP
UdpSocket provides functionality for communication over UDP
UnixListener and UnixStream provide functionality for communication over a Unix Domain Stream Socket (available on Unix only)
UnixDatagram provides functionality for communication over Unix Domain Datagram Socket (available on Unix only)

Modules

tcp TCP utility types, TCP 实用程序类型
unix Unix specific network types, 基于Unix的网络类型

Structs

  • TcpListener
    A TCP socket server, listening for connections.
  • TcpSocket
    A TCP socket that has not yet been converted to a TcpStream or TcpListener.
  • TcpStream
    A TCP stream between a local and a remote socket.
  • UdpSocket
    A UDP socket.
  • UnixDatagram
    An I/O object representing a Unix datagram socket.
  • UnixListener
    A Unix socket which can accept connections from other Unix sockets.
  • UnixStream
    A structure representing a connected Unix socket.

Struct tokio::net::TcpSocket

介绍

pub struct TcpSocket {
    /* private fields */ }

还未转换为TcpStream或TcpListener的socket
封装了OS套接字,并在建立TCP连接之前(C端)/接收入流量之前(S端),配置套接字

Rust 的 TcpSocket 类型是基于 RAII(Resource Acquisition Is Initialization)语法设计。它在创建时会获取系统资源(即打开一个 TCP 套接字),并在其生命周期结束时自动释放该资源(即关闭套接字)。
这种设计方式在 Rust 中通常被称为 “资源句柄”,在 C++ 和其他语言中也称为 “智能指针”。

当 TcpSocket 的值被丢弃时,它所持有的套接字将被自动关闭
这种机制确保资源正确释放,避免像 “内存泄漏” 或 “文件句柄泄漏” 等问题。

TcpStream::connect("127.0.0.1:8080")

等价于

use tokio::net::TcpSocket;

use std::io;

#[tokio::main]
async fn main() -> io::Result<()> {
   
    let addr = "127.0.0.1:8080".parse().unwrap();

    let socket = TcpSocket::new_v4()?;
    let stream = socket.connect(addr).await?;

    Ok(())
}
TcpListener::bind("127.0.0.1:8080")

等价于

use tokio::net::TcpSocket;

use std::io;

#[tokio::main]
async fn main() -> io::Result<()> {
   
	// 使用 parse() 方法将字符串解析为 SocketAddr 类型的值
	// 使用 unwrap() 方法处理可能发生的错误
	// 使用 unwrap() 方法处理错误可能会导致程序 panic,需要用其他错误处理机制
    let addr = "127.0.0.1:8080".parse().unwrap();

    let socket = TcpSocket::new_v4()?;
    // On platforms with Berkeley-derived sockets, this allows to quickly
    // rebind a socket, without needing to wait for the OS to clean up the
    // previous one.
    //
    // On Windows, this allows rebinding sockets which are actively in use,
    // which allows “socket hijacking”, so we explicitly don't set it here.
    // https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse
    // 地址重用
    socket.set_reuseaddr(true)?;
    socket.bind(addr)?;

    let listener = socket.listen(1024)?;

    Ok(())
}

TcpSocket 类型本身仅提供了一些基本的套接字选项,例如设置超时等。
如果需要设置其他的套接字选项,如设置 SO_SNDBUF 或 SO_RCVBUF 缓冲区大小等,可以使用 RawFd 或 RawSocket 类型,通过 std::os::unix::io::AsRawFd 或 std::os::windows::io::AsRawSocket 方法获取原始文件描述符或原始套接字句柄,并结合 socket2 crate 等三方 crate 来设置所需的选项。

方法

全部方法

在这里插入图片描述

tos

获取socket的IP_TOS option

在计算机网络中,IP_TOS 是一种 IP 数据报头中的字段,用于指定 IP 数据报的优先级和特殊处理。TOS 是 Type of Service(服务类型)的缩写,该字段已被新的 DSCP(Differentiated Services Code Point,差异化服务代码点)替换,DSCP 可以更好地实现服务质量(QoS)。

IP_TOS 的高 3 位被称为 IP 优先级,低 5 位被称为 IP 服务类型。

IP 优先级可以分为以下几个类别:

  • Routine:标准优先级,用于常规的互联网流量。
  • Priority:较高优先级,用于需要优先处理的流量。
  • Immediate:整个网络中的最高优先级,用于紧急情况下的流量。
  • Flash:用于需要快速处理的流量,如交互式应用。
  • Flash Override:优先级更高的 Flash 流量。
  • Critical:对 CPU 空闲时间敏感的流量。
  • Internetwork Control:用于互联网控制流量,例如 ICMP 信息。

IP 服务类型可以分为以下几个类别:

  • Low Delay:要求尽可能低的延迟。
  • High Throughput:要求高吞吐量。
  • High Reliability:需要极高的可靠性。
  • Minimize Cost:要求尽可能低的传输成本。

在 IP 数据报头的 TOS 字段中,这些值可以通过位运算进行组合使用,从而实现具有不同优先级和服务类型的 IP 数据报的传输。例如,可以将高于 Routine 优先级的包发送到专用的信道,这些信道在网络流量规划中优先处理,以实现更快的传输速度和更高的可靠性。

from_std_stream

std::net::TcpStream 转为 TcpSocket
The provided socket must not have been connected prior to calling this function
调用该函数前,提供的socket不能处于连接状态
typically used together with crates such as socket2 to configure socket options that are not available on TcpSocket.
通常和socket2一起使用,来配置socket选项,因为TcpSocket提供的功能有限

use tokio::net::TcpSocket;
use socket2::{
   Domain, Socket, Type};

#[tokio::main]
async fn main() -> std::io::Result<()> {
   
    let socket2_socket = Socket::new(Domain::IPV4, Type::STREAM, None)?;
    socket2_socket.set_nonblocking(true)?;

    let socket = TcpSocket::from_std_stream(socket2_socket.into

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;项目8创建电子相册&#xff09; 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册&#xff0c;或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢&#xff1f;可以跟…

21天学会C++:Day13----动态内存管理

CSDN的uu们&#xff0c;大家好。这里是C入门的第十三讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 加深对内存四区的理解 2. new-delete 与 malloc-free 2.1 能否用 fre…

Django:一、创建项目、APP及启动Django

一、准备工具 Pycharm企业版 二、创建项目 打开Pycharm企业版&#xff0c;创建Django项目。 注意&#xff1a;①删除项目下的templates文件夹&#xff1b;②删除setting.py文件中的一行代码 默认文件介绍&#xff1a; 三、创建APP 点击Pycharm左下角Terminal&#xff0c;打…

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试1&#xff09;权限注册2&#xff09;模型导入3&#xff09;总体模型构建4&#xff09;处理视频中的预览帧数据5&#xff09;处理图片数…

区块链技术:解密去中心化的革命

文章目录 区块链的基础概念什么是区块链&#xff1f;区块链的核心原理1. 分布式账本2. 区块3. 加密技术4. 共识机制 区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用 区块链的应用领域1. 金融服务2. 供应链管理3. 物联网4. 医疗保健5. 政府与公共服务 区块链的未…

图像练习OpenCV(01)

提取出里面最大矩形的四个顶点坐标 源图像 结果展示 代码 void getLine(std::vector<int>& data, int threshold) {for (int x 0; x < data.size(); x){if (0 data[x]){continue;}int maxValue 0, maxLoc -1, i -1;for (i x; i < data.size(); i){if …

【2023集创赛】Arm杯二等奖作品:基于Arm Cortex-M3的体感节奏音乐游戏机

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;安谋科技杯全国二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

跑腿系统开发:构建实时任务分配算法的技术挑战

在跑腿系统中&#xff0c;实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战&#xff0c;并提供一个简单的Python示例来解决这些挑战。 技术挑战&#xff1a; 实时数据处理&#xff1a; 跑腿系统需要处理大量的实时任…

Ganache本地测试网+cpolar内网穿透实现公网访问内网

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

K8S:Pod概念、分类及相关的策略

文章目录 一.pod相关概念&#xff11;.Pod基础概念&#xff12;.Kubrenetes集群中Pod两种使用方式&#xff13;.pause容器的Pod中的所有容器共享的资源&#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a;&#xff15;.Kubernetes设计这样的Pod概念和特殊…

本地搭建CFimagehost私人图床——“cpolar内网穿透”

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

7.algorithm2e中while怎么使用

algorithm2e中while怎么使用 在 algorithm2e 宏包中&#xff0c;要使用 while 循环&#xff0c;您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…

Mac电脑音视频播放器: Infuse for Mac中文

Infuse是一款流行的多媒体播放器应用程序&#xff0c;适用于iOS、tvOS和macOS平台。它由Firecore开发&#xff0c;旨在提供出色的媒体播放体验&#xff0c;并支持广泛的视频和音频格式。 以下是Infuse的一些主要功能和特点&#xff1a; 多媒体格式支持&#xff1a;Infuse支持…

ROS2 从头开始​​:第 1 部分 — 机器人操作系统简介

火星上的机器人&#xff08;AI生成图像&#xff09; 一、说明 ROS2是机器人的朋友&#xff0c;一个他们所依赖的平台&#xff0c;用于沟通、协调和控制&#xff0c;帮助他们实现目标。ROS2以DDS为核心&#xff0c;帮助机器人探索新世界、新任务、新可能性&#xff0c;是一个方…

代码随想录--链表-反转链表

题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双指针 public class Main {public static class ListNode {int val;ListNode next;ListNode(int x) {val x;}}public ListNode reverseList(L…

涨知识,关于代码签名证书10大常见问题解答

在当今互联网时代&#xff0c;各种软件程序充斥着这个网络世界&#xff0c;大大小小的软件层出不穷&#xff0c;如何让用户信任软件并下载软件&#xff0c;是众多软件开发公司需要解决的问题&#xff0c;由此代码签名证书应运而生&#xff0c;提供了软件程序的身份认证、完整性…

uni-app获取元素具体位置获取失败

场景&#xff1a;想要通过链接跳转传递catid&catid2类别id,商品类别id 跳到这一页左侧对应的类别栏上面,同时跳到右侧列表滚动到对应商品那一块区域。 遇到的问题&#xff1a;在for循环中通过绑定id获取不到商品列表的具体位置。 原因&#xff1a;在onReady函数和mounted函…

【Java】医院智能导诊系统源码:解决患者盲目就诊问题、降低患者挂错号比例

医院智能导诊系统解决患者盲目就诊问题&#xff0c;减轻分诊工作压力。降低患者挂错号比例&#xff0c;优化患者就诊流程&#xff0c;有效提高线上线下医疗机构接诊效率。患者可通过人体画像选择症状部位&#xff0c;了解对应病症信息和推荐就医科室。 一、医院智能导诊系统概述…

科锐逆向第二阶段(一)SDK

基本概念 什么是 SDK SDK 是软件开发工具包&#xff08;Software Development Kit&#xff09;的缩写。它是一个集成了软件开发所需工具、库文件、示例代码和文档等资源的软件包。 SDK 通常由软件开发公司或平台提供&#xff0c;旨在帮助开发人员构建、测试和部署特定类型的…

Offset Explorer(Kafka消息可视化工具)报invalid hex digit ‘{‘错误解决方法

解决办法&#xff1a; 根据代码的实际情况&#xff0c;设置成对应的值。设置完成后点update、refresh更新。