tokio::net学习

2023-09-16 15:49:05

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
更多推荐

3.SpringEL方法调用实例

SpringEL方法调用实例文章目录SpringEL方法调用实例介绍SpringEL在注解的形式SpringEL调用List,Map中的方法**从List中过滤元素****从Map中获取值**SpringEL在XML的形式介绍Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到

线路板的性能和技术要求有哪些

PCB加工厂家电路板的性能和技术要求与线路板的结构类型、选用的基材有关。不同类型(刚性和挠性)、不同结构(单面、双面、多层、有或无盲孔、埋孔等)、不同基材的PCB板,性能指标是不同的。它的性能等级,与产品设计一样按使用范围通常分为三个等级,PCB厂家描述产品在复杂性、功能性要求的程度和试验、检验的频度的不同。不同性能等

java 单元测试Junit

所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个

[设计模式] 浅谈SOLID设计原则

目录单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒转原则SOLID是一个缩写词,代表以下五种设计原则单一职责原则SingleResponsibilityPrinciple,SRP开闭原则Open-ClosedPrinciple,OCP里氏替换原则LiskovSubstitutionPrinciple,LSP接口隔离

华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

目录专栏导读一、题目描述二、输入描述三、输出描述四、解题思路特别鸣谢:感谢fly晨发现这个问题,并提供更优质的算法。解题思路如下:五、Java算法源码六、效果展示1、输入2、输出3、思路专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释

模式识别与人工智能(程序与算法)系列讲解 - 总目录

模式识别与人工智能(程序与算法)系列讲解-总目录作者:安静到无声作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。Thanks♪(・ω・)ノ如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!o( ̄▽ ̄)dლ(°◕‵ƹ′◕ლ)希望在传播知识、分享

【算法系列 | 8】深入解析查找算法之—二分查找

序言心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。我们一起努力,成为更好的自己!今天第8讲,讲一下查找算法的二分查找1基础介绍查找算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。以下是一些常见的查找算法及其应

通过 chatgpt 协助完成网站数据破解

Chatgpt的出现极大地提升了程序员的工作效率,常见的使用场景包括代码自动生成、代码静态检查等,那么chatgpt能否用于某些网站的数据破解工作呢?问题某天线上服务开始报警,原来是某个视频网站无法获取到其cdn地址导致的下载失败问题。经过debug发现原来的明文数据现在变成了加密数据(数据放在html中),如下由于职

Boostrap对HTML的表格的设计和优化

目录01-Bootstrap的默认表格风格02-没有边线-边界的表格03-行与行的背景颜色交替变换(条纹样式)04-给表格加上边框效果05-鼠标移到行上时该行的颜色加深06-把表格的padding值缩减一半,使表格看起来更紧凑07-为表格的行或单元格设置颜色01-Bootstrap的默认表格风格Bootstrap对表格

生信分析Python实战练习 9 | 视频27

开源生信Python教程生信专用简明Python文字和视频教程源码在:https://github.com/Tong-Chen/Bioinfo_course_python目录背景介绍编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Pyt

Springboot部署服务器项目上线

第一步,项目打包,有两种方式第一种、直接在项目根目录打开终端,输入以下语句即可。如下图:mvncleanpackage-DskipTests第二种、在右侧点击Maven选项,选择鼠标左键双击package选项即可。如下图:两种方法的结果,都会得到我们需要jar包,效果如下图:(可选项)如果觉得jar包名太难记,还可以在

热文推荐