seq_pair.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use nix::sys::socket::{socketpair, AddressFamily, SockFlag, SockType};
  2. use std::fs::File;
  3. use std::io::{Error, Read, Write};
  4. use std::os::fd::FromRawFd;
  5. pub fn test_seq_pair() -> Result<(), Error> {
  6. // 创建 socket pair
  7. let (sock1, sock2) = socketpair(
  8. AddressFamily::Unix,
  9. SockType::SeqPacket, // 使用 SeqPacket 类型
  10. None, // 协议默认
  11. SockFlag::empty(),
  12. )
  13. .expect("Failed to create socket pair");
  14. let mut socket1 = unsafe { File::from_raw_fd(sock1) };
  15. let mut socket2 = unsafe { File::from_raw_fd(sock2) };
  16. // sock1 写入数据
  17. let msg = b"hello from sock1";
  18. socket1.write_all(msg)?;
  19. println!("sock1 send: {:?}", String::from_utf8_lossy(&msg[..]));
  20. // 因os read和write时会调整file的offset,write会对offset和meta size(目前返回的都是0)进行比较,
  21. // 而read不会,故双socket都先send,后recv
  22. // sock2 回复数据
  23. let reply = b"hello from sock2";
  24. socket2.write_all(reply)?;
  25. println!("sock2 send: {:?}", String::from_utf8_lossy(reply));
  26. // sock2 读取数据
  27. let mut buf = [0u8; 128];
  28. let len = socket2.read(&mut buf)?;
  29. println!("sock2 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
  30. // sock1 读取回复
  31. let len = socket1.read(&mut buf)?;
  32. println!("sock1 receive: {:?}", String::from_utf8_lossy(&buf[..len]));
  33. Ok(())
  34. }