网络编程
套接字的类型
流套接字(SOCK_STREAM)
只能处理TCP协议数据。
提供安全的、面向连接的、全双工的、基于字节流的字节流服务。
数据报套接字(SOCK_DGRAM)
只能处理UDP协议数据。
提供不可靠、不可靠、不可靠、无连接、无地址的、不可靠的数据报服务。
原始套接字(SOCK_RAW)
提供原始的、未加工的、未封装的、允许直接读写内核中的IP数据包。
IP地址枚举IpAddr
IP地址类似主机的门牌号
rust
// 打印IpV4和IpV6地址
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
fn main() {
let ipv4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
let ipv6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
println!("ipv4: {:?}", ipv4);
println!("ipv6: {:?}", ipv6);
assert_eq!("127.0.0.1".parse(), Ok(ipv4));
assert_eq!("::1".parse(), Ok(ipv6));
assert_eq!(ipv4.is_ipv6(), false);
assert_eq!(ipv4.is_ipv4(), true);
}
TCP监听器TcpListener
rust
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
fn main() {
// TCP监听器
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
for stream in listener.incoming() {
// 处理连接
let stream = stream.unwrap();
println!("Connection established!");
handle_connection(stream);
}
}
fn handle_connection(p0: TcpStream) {
let mut p1 = p0;
// 发送回复
let response = "HTTP/1.1 200 OK\r\n\r\nHello, World!";
p1.write(response.as_bytes()).unwrap();
p1.flush().unwrap();
println!("Response sent!");
// 读取请求
let mut buffer = [0; 1024];
p1.read(&mut buffer).unwrap();
println!("Request: {}", String::from_utf8_lossy(&buffer[..]));
}
TCP流结构TcpStream
rust