基于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通信场景。

Powered by Jekyll and Theme by solid