1 //! Test a simple IPv6 socket server and client.
2 //!
3 //! The client send a message and the server sends one back.
4
5 #![cfg(not(any(target_os = "redox", target_os = "wasi")))]
6
7 use rustix::net::{
8 accept, bind_v6, connect_v6, getsockname, listen, recv, send, socket, AddressFamily, Ipv6Addr,
9 Protocol, RecvFlags, SendFlags, SocketAddrAny, SocketAddrV6, SocketType,
10 };
11 use std::sync::{Arc, Condvar, Mutex};
12 use std::thread;
13
14 const BUFFER_SIZE: usize = 20;
15
server(ready: Arc<(Mutex<u16>, Condvar)>)16 fn server(ready: Arc<(Mutex<u16>, Condvar)>) {
17 let connection_socket = socket(
18 AddressFamily::INET6,
19 SocketType::STREAM,
20 Protocol::default(),
21 )
22 .unwrap();
23
24 let name = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 0, 0, 0);
25 bind_v6(&connection_socket, &name).unwrap();
26
27 let who = match getsockname(&connection_socket).unwrap() {
28 SocketAddrAny::V6(addr) => addr,
29 _ => panic!(),
30 };
31
32 listen(&connection_socket, 1).unwrap();
33
34 {
35 let (lock, cvar) = &*ready;
36 let mut port = lock.lock().unwrap();
37 *port = who.port();
38 cvar.notify_all();
39 }
40
41 let mut buffer = vec![0; BUFFER_SIZE];
42 let data_socket = accept(&connection_socket).unwrap();
43 let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap();
44 assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "hello, world");
45
46 send(&data_socket, b"goodnight, moon", SendFlags::empty()).unwrap();
47 }
48
client(ready: Arc<(Mutex<u16>, Condvar)>)49 fn client(ready: Arc<(Mutex<u16>, Condvar)>) {
50 let port = {
51 let (lock, cvar) = &*ready;
52 let mut port = lock.lock().unwrap();
53 while *port == 0 {
54 port = cvar.wait(port).unwrap();
55 }
56 *port
57 };
58
59 let addr = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), port, 0, 0);
60 let mut buffer = vec![0; BUFFER_SIZE];
61
62 let data_socket = socket(
63 AddressFamily::INET6,
64 SocketType::STREAM,
65 Protocol::default(),
66 )
67 .unwrap();
68 connect_v6(&data_socket, &addr).unwrap();
69
70 send(&data_socket, b"hello, world", SendFlags::empty()).unwrap();
71
72 let nread = recv(&data_socket, &mut buffer, RecvFlags::empty()).unwrap();
73 assert_eq!(String::from_utf8_lossy(&buffer[..nread]), "goodnight, moon");
74 }
75
76 #[test]
test_v6()77 fn test_v6() {
78 let ready = Arc::new((Mutex::new(0_u16), Condvar::new()));
79 let ready_clone = Arc::clone(&ready);
80
81 let server = thread::Builder::new()
82 .name("server".to_string())
83 .spawn(move || {
84 server(ready);
85 })
86 .unwrap();
87 let client = thread::Builder::new()
88 .name("client".to_string())
89 .spawn(move || {
90 client(ready_clone);
91 })
92 .unwrap();
93 client.join().unwrap();
94 server.join().unwrap();
95 }
96