006 Rust 网络编程,mio 库介绍

   日期:2020-05-06     浏览:68    评论:0    
核心提示:mio标准库也缺乏对套接字和连接的细粒度控制,例如设置SO_REUSEADDR。mio库则提供了很多rust

mio

标准库也缺乏对套接字和连接的细粒度控制,例如设置SO_REUSEADDR。mio库则提供了很多方法来解决这些问题。

依赖

[dependencies]
mio = { version = "0.7.0", features = ["os-poll", "tcp"]}

源码示例

use mio::net::{TcpListener, TcpStream};
use mio::{Events, Interest, Poll, Token};

const SERVER: Token = Token(0);
const CLIENT: Token = Token(1);

fn main() -> std::io::Result<()> {
    let mut poll = Poll::new()?;
    let mut events = Events::with_capacity(128);

    // 创建server端socket
    let addr = "127.0.0.1:8080".parse().unwrap();
    let mut server = TcpListener::bind(addr)?;
    
    // 开始监听该链接
    poll.registry()
        .register(&mut server, SERVER, Interest::READABLE)?;

    // 创建客户端链接到服务端
    let mut client = TcpStream::connect(addr)?;

    // 监听客户端
    poll.registry()
        .register(&mut client, CLIENT, Interest::READABLE | Interest::WRITABLE)?;

    // 启动循环
    loop {
        // 轮训事件
        poll.poll(&mut events, None)?;

        // 处理事件
        let mut cnt = 0;
        for event in events.iter() {
            match event.token() {
                SERVER => {
                    let connection = server.accept();
                    println!("SERVER recv a connection! cnt = {}", cnt);
                    drop(connection);
                }
                CLIENT => {
                    if event.is_writable() {
                        println!("CLIENT write, cnt = {}", cnt);
                    }

                    if event.is_readable() {
                        println!("CLIENT read, cnt = {}", cnt);
                    }
                    
                    return Ok(());
                }

                _ => unreachable!(),
            }
            cnt += 1;
        }
    }
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服