赞
踩
Rust 实战 - 使用套接字联网API (一)
参考URL: https://www.jianshu.com/p/d1048d0b687f
使用Rust编写一个简单的Socket服务器(1):Rust下的配置载入
参考URL: https://my.oschina.net/u/4528547/blog/4951186
官网rust可以调的libc:http://www.eclipse.org/paho/files/rustdoc/libc/index.html#
Rust 实战 - 使用套接字联网API (一)
参考URL:https://www.jianshu.com/p/d1048d0b687f
use std::os::raw::c_char; use std::ffi::CStr; extern { pub fn gethostname(name: *mut c_char, len: usize) -> i32; } fn main() { let len = 255; let mut buf = Vec::<u8>::with_capacity(len); let ptr = buf.as_mut_ptr() as *mut c_char; unsafe { gethostname(ptr, len); println!("{:?}", CStr::from_ptr(ptr)); } }
extren 表示“外部块(External blocks)”,用来申明外部非 Rust 库中的符号。我们需要使用 Rust 以外的函数,比如 libc ,就需要在 extren 中将需要用到的函数定义出来,然后就可以像使用本地函数一样使用外部函数,编译器会负责帮我们转换。但是,调用一个外部函数是unsafe的,编译器不能提供足够的保证,所以要放到unsafe块中。
“gethostname” 函数在 C 头文件中的原型是:
int gethostname(char *name, size_t len);
在 Linux 64位平台上,C中的int对应于Rust中的int,size_t对应Rust中的usize,但C中的char与Rust中的char是完全不同的,C中的char始终是i8或者u8,而 Rust 中的char是一个unicode标量值。你也可以去标准库查看。对于指针,Rust 中的裸指针 与C中的指针几乎是一样的,Rust的*mut对应C的普通指针,*const 对应C的const指针。因此我们将类型一一对应,函数的参数名称不要求一致。
请查看原文!
Rust 实战 - 使用套接字联网API (一)
参考URL: https://www.jianshu.com/p/d1048d0b687f
官网rust可以调的libc:http://www.eclipse.org/paho/files/rustdoc/libc/index.html#
Rust 实战 - 使用套接字联网API (一)
https://www.jianshu.com/p/d1048d0b687f
说起套接字API,主要包括TCP、UDP、SCTP相关的函数,I/O复用函数和高级I/O函数。其中大部分函数Rust标准里是没有的,如果标准库不能满足你的需求,你可以直接调用libc中的函数。实际上,标准库中,网络这一块,也基本是对libc中相关函数的封装。
请查看原文!
Rust 实战 - 使用套接字联网API (一)
参考URL: https://www.jianshu.com/p/d1048d0b687f
标准库:https://doc.rust-lang.org/std/
标准库net模块:https://doc.rust-lang.org/std/net/index.html
Rust 标准库是便携式 Rust 软件的基础,它是一组经过实战测试的最小共享抽象,适用于更广泛的 Rust 生态系统。它提供核心类型,如Vec和 Option、库定义的语言原语、标准宏、I/O和 多线程等操作,等等。
std默认情况下可用于所有 Rust crate。因此,可以use通过路径在语句中 访问标准库std,如use std::env.
标准库net模块:https://doc.rust-lang.org/std/net/index.html
Rust标准库 net模块 提供用于TCP / UDP通信的网络原语。
该模块为传输控制和用户数据报协议以及 IP 和套接字地址的类型提供网络功能。
rust实现一个tcp server
参考URL: https://blog.csdn.net/by186/article/details/117234191
Rust Web 全栈开发 - 1 构建TCP Server
参考URL: https://blog.csdn.net/weixin_51487151/article/details/123784175
【推荐,作者还有压力测试】Rust 编写一个简单,高并发的http服务(纯标准库,编译后168kb),附并发压力测试
参考URL: https://blog.csdn.net/qq_26373925/article/details/109187251
服务端
use std ::net::{TcpListener,TcpStream}; use std::thread; use std::time; use std::io; use std::io::{Read,Write}; fn handle_client(mut stream: TcpStream) -> io::Result<()>{ let mut buf = [0;512]; for _ in 0..1000{ let bytes_read = stream.read(&mut buf)?; if bytes_read == 0{ return Ok(()); } stream.write(&buf[..bytes_read])?; thread::sleep(time::Duration::from_secs(1)); } Ok(()) } fn main() -> io::Result<()>{ let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); let mut thread_vec: Vec<thread::JoinHandle<()>> = Vec::new(); for stream in listener.incoming() { let stream = stream.expect("failed"); let handle = thread::spawn(move || { handle_client(stream).unwrap_or_else(|error| eprintln!("{:?}",error)) }); thread_vec.push(handle); } for handle in thread_vec { handle.join().unwrap(); } Ok(()) }
使用TcpListener监听Socket请求
使用Read/Write Trait进行Socket数据读写
客户端
use std::io::{self,prelude::*,BufReader,Write}; use std::net::TcpStream; use std::str; fn main() -> io::Result<( )> { let mut stream = TcpStream::connect("127.0.0.1:7878")?; for _ in 0..1000 { let mut input = String::new(); io::stdin().read_line(&mut input).expect("Failed to read"); stream.write(input.as_bytes()).expect("failed to write"); let mut reader =BufReader::new(&stream); let mut buffer: Vec<u8> = Vec::new(); reader.read_until(b'\n',&mut buffer)?; println!("read form server:{}",str::from_utf8(&buffer).unwrap()); println!(""); } Ok(()) }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。