基于rust的tcp通信场景
首先安装nmap
:
安装好以后,使用里面提供的ncat
命令来启动一个简单的tcp echo server:
$ ncat -v -l 8888 --keep-open --exec "/bin/cat"
上面的命令会侦听8888
端口,并且使用cat
命令来处理连接过来的请求。
下面是执行效果:
接下来用nc
命令来测试连接:
$ echo "Hello" | nc localhost 8888
上面的命令会发送Hello
字串到8888
端口。下面是执行结果:
可以看到服务端处理了请求,并且返回了Hello
给客户端。
接下来写一段rust的代码来连接服务端(代码来源:Rust - A simple TCP client and server application: echo):
use std::net::{TcpStream};
use std::io::{Read, Write};
use std::str::from_utf8;
fn main() {
match TcpStream::connect("localhost:8888") {
Ok(mut stream) => {
println!("Successfully connected to server in port 8888");
let msg = b"Hello!";
stream.write(msg).unwrap();
println!("Sent Hello, awaiting reply...");
let mut data = [0 as u8; 6]; // using 6 byte buffer
match stream.read_exact(&mut data) {
Ok(_) => {
if &data == msg {
println!("Reply is ok!");
} else {
let text = from_utf8(&data).unwrap();
println!("Unexpected reply: {}", text);
}
},
Err(e) => {
println!("Failed to receive data: {}", e);
}
}
},
Err(e) => {
println!("Failed to connect: {}", e);
}
}
println!("Terminated.");
}
运行上面的代码会去连接localhost:8888
,然后发送Hello!
,并验证server返回了同样的数据。
运行代码结果如下:
可以看到逻辑正常运行。
通讯过程使用wireshark
进行捕获,可以看到「rust客户端」和「ncat服务端」的通信。首先是客户端向服务端发起请求:
然后是服务端返回数据:
以上就是一个rust的tcp通信场景。