上一节,我们已经实现了一个最小可运行版本。之所以使用Rust而不是C,是因为Rust具备了必要的抽象能力,还能获得跟C差不多的性能。这一节,我们对上一节的代码做必要的封装,顺便还能把unsafe
的代码包装成safe
的API。
我将上一节的源码放到了这里,你可以去查看。
还记得上一节,我们把使用到的libc
中的函数socket
、bind
、connect
和结构体sockaddr
、sockaddr_in
、in_addr
等,在Rust这边定义了出来。实际上,几乎libc
中的函数,libc这个crate都帮我们定义好了。你可以去这里查看。编译器和标准库本身也使用了这个crate,我们也使用这个。
首先在Cargo.toml
文件的[dependencies]
下面加入libc = "0.2"
:
[dependencies] libc = "0.2"
接着在main.rs
文件上方加入use libc;
,也可以use libc as c;
。或者你直接简单粗暴use libc::*
,并不推荐这样,除非你明确知道你使用的函数来自哪里。并将我们定义的与libc
中对用的常量、函数、结构体删除。再添加libc::
或c::
到我们使用那些常量、结构体、函数的地方。如果你是直接use libc::*
,除了直接删除那部分代码外,几乎什么都不用做。目前的代码: