DragonOS/user/apps/test_seqpacket/src/seq_pair.rs

41 lines
1.4 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use nix::sys::socket::{socketpair, AddressFamily, SockFlag, SockType};
use std::fs::File;
use std::io::{Error, Read, Write};
use std::os::fd::FromRawFd;
pub fn test_seq_pair() -> Result<(), Error> {
// 创建 socket pair
let (sock1, sock2) = socketpair(
AddressFamily::Unix,
SockType::SeqPacket, // 使用 SeqPacket 类型
None, // 协议默认
SockFlag::empty(),
)
.expect("Failed to create socket pair");
let mut socket1 = unsafe { File::from_raw_fd(sock1) };
let mut socket2 = unsafe { File::from_raw_fd(sock2) };
// sock1 写入数据
let msg = b"hello from sock1";
socket1.write_all(msg)?;
println!("sock1 send: {:?}", String::from_utf8_lossy(&msg[..]));
// 因os read和write时会调整file的offset,write会对offset和meta size(目前返回的都是0)进行比较,
// 而read不会故双socket都先send,后recv
// sock2 回复数据
let reply = b"hello from sock2";
socket2.write_all(reply)?;
println!("sock2 send: {:?}", String::from_utf8_lossy(reply));
// sock2 读取数据
let mut buf = [0u8; 128];
let len = socket2.read(&mut buf)?;
println!("sock2 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
// sock1 读取回复
let len = socket1.read(&mut buf)?;
println!("sock1 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
Ok(())
}