main.rs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. mod seq_pair;
  2. mod seq_socket;
  3. use seq_pair::test_seq_pair;
  4. use seq_socket::test_seq_socket;
  5. fn main() -> Result<(), std::io::Error> {
  6. if let Err(e) = test_seq_socket() {
  7. println!("[ fault ] test_seq_socket, err: {}", e);
  8. } else {
  9. println!("[success] test_seq_socket");
  10. }
  11. if let Err(e) = test_seq_pair() {
  12. println!("[ fault ] test_seq_pair, err: {}", e);
  13. } else {
  14. println!("[success] test_seq_pair");
  15. }
  16. Ok(())
  17. }
  18. // use nix::sys::socket::{socketpair, AddressFamily, SockFlag, SockType};
  19. // use std::fs::File;
  20. // use std::io::{Read, Write};
  21. // use std::os::fd::FromRawFd;
  22. // use std::{fs, str};
  23. // use libc::*;
  24. // use std::ffi::CString;
  25. // use std::io::Error;
  26. // use std::mem;
  27. // use std::os::unix::io::RawFd;
  28. // use std::ptr;
  29. // const SOCKET_PATH: &str = "/test.seqpacket";
  30. // const MSG: &str = "Hello, Unix SEQPACKET socket!";
  31. // fn create_seqpacket_socket() -> Result<RawFd, Error> {
  32. // unsafe {
  33. // let fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
  34. // if fd == -1 {
  35. // return Err(Error::last_os_error());
  36. // }
  37. // Ok(fd)
  38. // }
  39. // }
  40. // fn bind_socket(fd: RawFd) -> Result<(), Error> {
  41. // unsafe {
  42. // let mut addr = sockaddr_un {
  43. // sun_family: AF_UNIX as u16,
  44. // sun_path: [0; 108],
  45. // };
  46. // let path_cstr = CString::new(SOCKET_PATH).unwrap();
  47. // let path_bytes = path_cstr.as_bytes();
  48. // for (i, &byte) in path_bytes.iter().enumerate() {
  49. // addr.sun_path[i] = byte as i8;
  50. // }
  51. // if bind(fd, &addr as *const _ as *const sockaddr, mem::size_of_val(&addr) as socklen_t) == -1 {
  52. // return Err(Error::last_os_error());
  53. // }
  54. // }
  55. // Ok(())
  56. // }
  57. // fn listen_socket(fd: RawFd) -> Result<(), Error> {
  58. // unsafe {
  59. // if listen(fd, 5) == -1 {
  60. // return Err(Error::last_os_error());
  61. // }
  62. // }
  63. // Ok(())
  64. // }
  65. // fn accept_connection(fd: RawFd) -> Result<RawFd, Error> {
  66. // unsafe {
  67. // // let mut addr = sockaddr_un {
  68. // // sun_family: AF_UNIX as u16,
  69. // // sun_path: [0; 108],
  70. // // };
  71. // // let mut len = mem::size_of_val(&addr) as socklen_t;
  72. // let client_fd = accept(fd, std::ptr::null_mut(), std::ptr::null_mut());
  73. // if client_fd == -1 {
  74. // return Err(Error::last_os_error());
  75. // }
  76. // Ok(client_fd)
  77. // }
  78. // }
  79. // fn send_message(fd: RawFd, msg: &str) -> Result<(), Error> {
  80. // unsafe {
  81. // let msg_bytes = msg.as_bytes();
  82. // if send(fd, msg_bytes.as_ptr() as *const libc::c_void, msg_bytes.len(), 0) == -1 {
  83. // return Err(Error::last_os_error());
  84. // }
  85. // }
  86. // Ok(())
  87. // }
  88. // fn receive_message(fd: RawFd) -> Result<String, Error> {
  89. // let mut buffer = [0; 1024];
  90. // unsafe {
  91. // let len = recv(fd, buffer.as_mut_ptr() as *mut libc::c_void, buffer.len(), 0);
  92. // if len == -1 {
  93. // return Err(Error::last_os_error());
  94. // }
  95. // Ok(String::from_utf8_lossy(&buffer[..len as usize]).into_owned())
  96. // }
  97. // }
  98. // fn main() -> Result<(), Error> {
  99. // // Create and bind the server socket
  100. // fs::remove_file(&SOCKET_PATH).ok();
  101. // let server_fd = create_seqpacket_socket()?;
  102. // bind_socket(server_fd)?;
  103. // listen_socket(server_fd)?;
  104. // // Accept connection in a separate thread
  105. // let server_thread = std::thread::spawn(move || {
  106. // let client_fd = accept_connection(server_fd).expect("Failed to accept connection");
  107. // // Receive and print message
  108. // let received_msg = receive_message(client_fd).expect("Failed to receive message");
  109. // println!("Server: Received message: {}", received_msg);
  110. // // Close client connection
  111. // unsafe { close(client_fd) };
  112. // });
  113. // // Create and connect the client socket
  114. // let client_fd = create_seqpacket_socket()?;
  115. // unsafe {
  116. // let mut addr = sockaddr_un {
  117. // sun_family: AF_UNIX as u16,
  118. // sun_path: [0; 108],
  119. // };
  120. // let path_cstr = CString::new(SOCKET_PATH).unwrap();
  121. // let path_bytes = path_cstr.as_bytes();
  122. // // Convert u8 to i8
  123. // for (i, &byte) in path_bytes.iter().enumerate() {
  124. // addr.sun_path[i] = byte as i8;
  125. // }
  126. // if connect(client_fd, &addr as *const _ as *const sockaddr, mem::size_of_val(&addr) as socklen_t) == -1 {
  127. // return Err(Error::last_os_error());
  128. // }
  129. // }
  130. // send_message(client_fd, MSG)?;
  131. // // Close client connection
  132. // unsafe { close(client_fd) };
  133. // // Wait for server thread to complete
  134. // server_thread.join().expect("Server thread panicked");
  135. // fs::remove_file(&SOCKET_PATH).ok();
  136. // // 创建 socket pair
  137. // let (sock1, sock2) = socketpair(
  138. // AddressFamily::Unix,
  139. // SockType::SeqPacket, // 使用 SeqPacket 类型
  140. // None, // 协议默认
  141. // SockFlag::empty(),
  142. // ).expect("Failed to create socket pair");
  143. // let mut socket1 = unsafe { File::from_raw_fd(sock1) };
  144. // let mut socket2 = unsafe { File::from_raw_fd(sock2) };
  145. // // sock1 写入数据
  146. // let msg = b"hello from sock1";
  147. // socket1.write_all(msg)?;
  148. // println!("sock1 send: {:?}", String::from_utf8_lossy(&msg[..]));
  149. // // 因os read和write时会调整file的offset,write会对offset和meta size(目前返回的都是0)进行比较,
  150. // // 而read不会,故双socket都先send,后recv
  151. // // sock2 回复数据
  152. // let reply = b"hello from sock2";
  153. // socket2.write_all(reply)?;
  154. // println!("sock2 send: {:?}", String::from_utf8_lossy(reply));
  155. // // sock2 读取数据
  156. // let mut buf = [0u8; 128];
  157. // let len = socket2.read(&mut buf)?;
  158. // println!("sock2 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
  159. // // sock1 读取回复
  160. // let len = socket1.read(&mut buf)?;
  161. // println!("sock1 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
  162. // Ok(())
  163. // }