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:
裕依
2024-03-23 15:56:49 +08:00
committed by GitHub
parent 3660256a9e
commit 6046f77591
17 changed files with 511 additions and 242 deletions

3
user/apps/test_socket/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/target
Cargo.lock
/install/

View File

@ -0,0 +1,4 @@
[package]
name = "test_socket"
version = "0.1.0"
edition = "2021"

View 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

View 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(())
}

View 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))
}
}

View 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))
}
}

View File

@ -0,0 +1,22 @@
{
"name": "test_socket",
"version": "0.1.0",
"description": "测试socket",
"task_type": {
"BuildFromSource": {
"Local": {
"path": "apps/test_socket"
}
}
},
"depends": [],
"build": {
"build_command": "make install"
},
"clean": {
"clean_command": "make clean"
},
"install": {
"in_dragonos_path": "/"
}
}