123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- mod seq_pair;
- mod seq_socket;
- use seq_pair::test_seq_pair;
- use seq_socket::test_seq_socket;
- fn main() -> Result<(), std::io::Error> {
- if let Err(e) = test_seq_socket() {
- println!("[ fault ] test_seq_socket, err: {}", e);
- } else {
- println!("[success] test_seq_socket");
- }
- if let Err(e) = test_seq_pair() {
- println!("[ fault ] test_seq_pair, err: {}", e);
- } else {
- println!("[success] test_seq_pair");
- }
- Ok(())
- }
- // use nix::sys::socket::{socketpair, AddressFamily, SockFlag, SockType};
- // use std::fs::File;
- // use std::io::{Read, Write};
- // use std::os::fd::FromRawFd;
- // use std::{fs, str};
- // use libc::*;
- // use std::ffi::CString;
- // use std::io::Error;
- // use std::mem;
- // use std::os::unix::io::RawFd;
- // use std::ptr;
- // const SOCKET_PATH: &str = "/test.seqpacket";
- // const MSG: &str = "Hello, Unix SEQPACKET socket!";
- // fn create_seqpacket_socket() -> Result<RawFd, Error> {
- // unsafe {
- // let fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
- // if fd == -1 {
- // return Err(Error::last_os_error());
- // }
- // Ok(fd)
- // }
- // }
- // fn bind_socket(fd: RawFd) -> Result<(), Error> {
- // unsafe {
- // let mut addr = sockaddr_un {
- // sun_family: AF_UNIX as u16,
- // sun_path: [0; 108],
- // };
- // let path_cstr = CString::new(SOCKET_PATH).unwrap();
- // let path_bytes = path_cstr.as_bytes();
- // for (i, &byte) in path_bytes.iter().enumerate() {
- // addr.sun_path[i] = byte as i8;
- // }
- // if bind(fd, &addr as *const _ as *const sockaddr, mem::size_of_val(&addr) as socklen_t) == -1 {
- // return Err(Error::last_os_error());
- // }
- // }
- // Ok(())
- // }
- // fn listen_socket(fd: RawFd) -> Result<(), Error> {
- // unsafe {
- // if listen(fd, 5) == -1 {
- // return Err(Error::last_os_error());
- // }
- // }
- // Ok(())
- // }
- // fn accept_connection(fd: RawFd) -> Result<RawFd, Error> {
- // unsafe {
- // // let mut addr = sockaddr_un {
- // // sun_family: AF_UNIX as u16,
- // // sun_path: [0; 108],
- // // };
- // // let mut len = mem::size_of_val(&addr) as socklen_t;
- // let client_fd = accept(fd, std::ptr::null_mut(), std::ptr::null_mut());
- // if client_fd == -1 {
- // return Err(Error::last_os_error());
- // }
- // Ok(client_fd)
- // }
- // }
- // fn send_message(fd: RawFd, msg: &str) -> Result<(), Error> {
- // unsafe {
- // let msg_bytes = msg.as_bytes();
- // if send(fd, msg_bytes.as_ptr() as *const libc::c_void, msg_bytes.len(), 0) == -1 {
- // return Err(Error::last_os_error());
- // }
- // }
- // Ok(())
- // }
- // fn receive_message(fd: RawFd) -> Result<String, Error> {
- // let mut buffer = [0; 1024];
- // unsafe {
- // let len = recv(fd, buffer.as_mut_ptr() as *mut libc::c_void, buffer.len(), 0);
- // if len == -1 {
- // return Err(Error::last_os_error());
- // }
- // Ok(String::from_utf8_lossy(&buffer[..len as usize]).into_owned())
- // }
- // }
- // fn main() -> Result<(), Error> {
- // // Create and bind the server socket
- // fs::remove_file(&SOCKET_PATH).ok();
- // let server_fd = create_seqpacket_socket()?;
- // bind_socket(server_fd)?;
- // listen_socket(server_fd)?;
- // // Accept connection in a separate thread
- // let server_thread = std::thread::spawn(move || {
- // let client_fd = accept_connection(server_fd).expect("Failed to accept connection");
- // // Receive and print message
- // let received_msg = receive_message(client_fd).expect("Failed to receive message");
- // println!("Server: Received message: {}", received_msg);
- // // Close client connection
- // unsafe { close(client_fd) };
- // });
- // // Create and connect the client socket
- // let client_fd = create_seqpacket_socket()?;
- // unsafe {
- // let mut addr = sockaddr_un {
- // sun_family: AF_UNIX as u16,
- // sun_path: [0; 108],
- // };
- // let path_cstr = CString::new(SOCKET_PATH).unwrap();
- // let path_bytes = path_cstr.as_bytes();
- // // Convert u8 to i8
- // for (i, &byte) in path_bytes.iter().enumerate() {
- // addr.sun_path[i] = byte as i8;
- // }
- // if connect(client_fd, &addr as *const _ as *const sockaddr, mem::size_of_val(&addr) as socklen_t) == -1 {
- // return Err(Error::last_os_error());
- // }
- // }
- // send_message(client_fd, MSG)?;
- // // Close client connection
- // unsafe { close(client_fd) };
- // // Wait for server thread to complete
- // server_thread.join().expect("Server thread panicked");
- // fs::remove_file(&SOCKET_PATH).ok();
- // // 创建 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(())
- // }
|