mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 08:06:32 +00:00
Patch socketpair (#576)
* 将sockets分成inet和unix域 - 添加File端点 - 添加SocketPair trait并将Socket trait中的pair相关方法移动 - 添加对SockAddrUn的处理 * 精简SocketHandleItem * 重构socketpair相关逻辑 - 将File端点换成Inode端点 - 尝试使用SocketInode进行socketpair(未成功) * 将SocketPair trait合并到Socket trait中,去除downcast
This commit is contained in:
3
user/apps/test_socket/.gitignore
vendored
Normal file
3
user/apps/test_socket/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/target
|
||||
Cargo.lock
|
||||
/install/
|
4
user/apps/test_socket/Cargo.toml
Normal file
4
user/apps/test_socket/Cargo.toml
Normal file
@ -0,0 +1,4 @@
|
||||
[package]
|
||||
name = "test_socket"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
56
user/apps/test_socket/Makefile
Normal file
56
user/apps/test_socket/Makefile
Normal file
@ -0,0 +1,56 @@
|
||||
TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
||||
RUSTFLAGS+=""
|
||||
|
||||
ifdef DADK_CURRENT_BUILD_DIR
|
||||
# 如果是在dadk中编译,那么安装到dadk的安装目录中
|
||||
INSTALL_DIR = $(DADK_CURRENT_BUILD_DIR)
|
||||
else
|
||||
# 如果是在本地编译,那么安装到当前目录下的install目录中
|
||||
INSTALL_DIR = ./install
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH), x86_64)
|
||||
export RUST_TARGET=x86_64-unknown-linux-musl
|
||||
else ifeq ($(ARCH), riscv64)
|
||||
export RUST_TARGET=riscv64gc-unknown-linux-gnu
|
||||
else
|
||||
# 默认为x86_86,用于本地编译
|
||||
export RUST_TARGET=x86_64-unknown-linux-musl
|
||||
endif
|
||||
|
||||
run:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET)
|
||||
|
||||
build:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET)
|
||||
|
||||
clean:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET)
|
||||
|
||||
test:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET)
|
||||
|
||||
doc:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc --target $(RUST_TARGET)
|
||||
|
||||
fmt:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt
|
||||
|
||||
fmt-check:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt --check
|
||||
|
||||
run-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET) --release
|
||||
|
||||
build-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET) --release
|
||||
|
||||
clean-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET) --release
|
||||
|
||||
test-release:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET) --release
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --target $(RUST_TARGET) --path . --no-track --root $(INSTALL_DIR) --force
|
21
user/apps/test_socket/src/main.rs
Normal file
21
user/apps/test_socket/src/main.rs
Normal file
@ -0,0 +1,21 @@
|
||||
mod test_unix_stream;
|
||||
mod test_unix_stream_pair;
|
||||
|
||||
use test_unix_stream::test_unix_stream;
|
||||
use test_unix_stream_pair::test_unix_stream_pair;
|
||||
|
||||
fn main() -> std::io::Result<()> {
|
||||
if let Err(e) = test_unix_stream() {
|
||||
println!("[ fault ] test_unix_stream, err: {}", e);
|
||||
} else {
|
||||
println!("[success] test_unix_stream");
|
||||
}
|
||||
|
||||
if let Err(e) = test_unix_stream_pair() {
|
||||
println!("[ fault ] test_unix_stream_pair, err: {}", e);
|
||||
} else {
|
||||
println!("[success] test_unix_stream_pair");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
42
user/apps/test_socket/src/test_unix_stream.rs
Normal file
42
user/apps/test_socket/src/test_unix_stream.rs
Normal file
@ -0,0 +1,42 @@
|
||||
use std::io::{Error, Read, Write};
|
||||
use std::os::unix::net::{UnixListener, UnixStream};
|
||||
use std::thread;
|
||||
use std::{fs, str};
|
||||
|
||||
const SOCKET_PATH: &str = "/test.socket";
|
||||
const MSG: &str = "Hello, unix stream socket!";
|
||||
|
||||
fn client() -> std::io::Result<()> {
|
||||
// 连接到服务器
|
||||
let mut stream = UnixStream::connect(SOCKET_PATH)?;
|
||||
// 发送消息到服务器
|
||||
stream.write_all(MSG.as_bytes())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn test_unix_stream() -> std::io::Result<()> {
|
||||
println!("unix stream socket path: {}", SOCKET_PATH);
|
||||
// 删除可能已存在的socket文件
|
||||
fs::remove_file(&SOCKET_PATH).ok();
|
||||
// 创建Unix域监听socket
|
||||
let listener = UnixListener::bind(SOCKET_PATH)?;
|
||||
|
||||
let client_thread = thread::spawn(move || client());
|
||||
|
||||
// 监听并接受连接
|
||||
let (mut stream, _) = listener.accept().expect("listen error");
|
||||
|
||||
let mut buffer = [0; 1024];
|
||||
let nbytes = stream.read(&mut buffer).expect("read error");
|
||||
let received_msg = str::from_utf8(&buffer[..nbytes]).unwrap();
|
||||
|
||||
client_thread.join().ok();
|
||||
|
||||
fs::remove_file(&SOCKET_PATH).ok();
|
||||
|
||||
if received_msg == MSG {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::from_raw_os_error(-1))
|
||||
}
|
||||
}
|
21
user/apps/test_socket/src/test_unix_stream_pair.rs
Normal file
21
user/apps/test_socket/src/test_unix_stream_pair.rs
Normal file
@ -0,0 +1,21 @@
|
||||
use std::io::{Error, Read, Write};
|
||||
use std::os::unix::net::UnixStream;
|
||||
use std::str;
|
||||
|
||||
const MSG: &str = "Hello, unix stream socketpair!";
|
||||
|
||||
pub fn test_unix_stream_pair() -> std::io::Result<()> {
|
||||
let (mut sock0, mut sock1) = UnixStream::pair()?;
|
||||
|
||||
sock1.write_all(MSG.as_bytes())?;
|
||||
|
||||
let mut buffer = [0; 1024];
|
||||
let nbytes = sock0.read(&mut buffer).expect("read error");
|
||||
let received_msg = str::from_utf8(&buffer[..nbytes]).unwrap();
|
||||
|
||||
if received_msg == MSG {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::from_raw_os_error(-1))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user