Skip to content

Commit f3ed9bf

Browse files
authored
add sendmsg/recvmsg test (#368)
2 parents 55f4d1d + 4f20e48 commit f3ed9bf

File tree

4 files changed

+226
-0
lines changed

4 files changed

+226
-0
lines changed

open-coroutine/examples/socket_co.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use open_coroutine::task;
22
use std::io::{Error, ErrorKind, IoSlice, IoSliceMut, Read, Write};
33
use std::net::{Shutdown, TcpListener, ToSocketAddrs};
4+
#[cfg(unix)]
5+
use std::os::fd::AsRawFd;
46
use std::sync::{Arc, Condvar, Mutex};
57
use std::time::Duration;
68

@@ -36,6 +38,30 @@ pub fn start_co_server<A: ToSocketAddrs>(addr: A, server_finished: Arc<(Mutex<bo
3638
);
3739
println!("Server Send Multiple");
3840
}
41+
#[cfg(unix)]
42+
for _ in 0..3 {
43+
let mut buffers =
44+
[IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
45+
let mut msg = libc::msghdr {
46+
msg_name: std::ptr::null_mut(),
47+
msg_namelen: 0,
48+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
49+
msg_iovlen: buffers.len() as _,
50+
msg_control: std::ptr::null_mut(),
51+
msg_controllen: 0,
52+
msg_flags: 0,
53+
};
54+
assert_eq!(26, unsafe {
55+
libc::recvmsg(socket.as_raw_fd(), &mut msg, 0)
56+
});
57+
eprintln!(
58+
"Server Received Message: {} {}",
59+
String::from_utf8_lossy(&buffer1),
60+
String::from_utf8_lossy(&buffer2)
61+
);
62+
assert_eq!(512, unsafe { libc::sendmsg(socket.as_raw_fd(), &msg, 0) });
63+
eprintln!("Server Send Message");
64+
}
3965
println!("Server Shutdown Write");
4066
if socket.shutdown(Shutdown::Write).is_ok() {
4167
println!("Server Closed Connection");
@@ -87,6 +113,37 @@ pub fn start_co_client<A: ToSocketAddrs>(addr: A) {
87113
String::from_utf8_lossy(&buffer2)
88114
);
89115
}
116+
#[cfg(unix)]
117+
for i in 0..3 {
118+
let mut request1 = format!("MessagePart{i}1").into_bytes();
119+
let mut request2 = format!("MessagePart{i}2").into_bytes();
120+
let mut buffers = [
121+
IoSliceMut::new(request1.as_mut_slice()),
122+
IoSliceMut::new(request2.as_mut_slice()),
123+
];
124+
let mut msg = libc::msghdr {
125+
msg_name: std::ptr::null_mut(),
126+
msg_namelen: 0,
127+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
128+
msg_iovlen: buffers.len() as _,
129+
msg_control: std::ptr::null_mut(),
130+
msg_controllen: 0,
131+
msg_flags: 0,
132+
};
133+
assert_eq!(26, unsafe { libc::sendmsg(stream.as_raw_fd(), &msg, 0) });
134+
eprintln!("Client Send Message");
135+
buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
136+
msg.msg_iov = buffers.as_mut_ptr().cast::<libc::iovec>();
137+
msg.msg_iovlen = buffers.len() as _;
138+
assert_eq!(512, unsafe {
139+
libc::recvmsg(stream.as_raw_fd(), &mut msg, 0)
140+
});
141+
eprintln!(
142+
"Client Received Message: {}{}",
143+
String::from_utf8_lossy(&buffer1),
144+
String::from_utf8_lossy(&buffer2)
145+
);
146+
}
90147
println!("Client Shutdown Write");
91148
stream.shutdown(Shutdown::Write).expect("shutdown failed");
92149
println!("Client Closed");

open-coroutine/examples/socket_co_client.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use open_coroutine::task;
22
use std::io::{Error, ErrorKind, IoSlice, IoSliceMut, Read, Write};
33
use std::net::{Shutdown, TcpListener, ToSocketAddrs};
4+
#[cfg(unix)]
5+
use std::os::fd::AsRawFd;
46
use std::sync::{Arc, Condvar, Mutex};
57
use std::time::Duration;
68

@@ -34,6 +36,29 @@ pub fn start_server<A: ToSocketAddrs>(addr: A, server_finished: Arc<(Mutex<bool>
3436
);
3537
println!("Server Send Multiple");
3638
}
39+
#[cfg(unix)]
40+
for _ in 0..3 {
41+
let mut buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
42+
let mut msg = libc::msghdr {
43+
msg_name: std::ptr::null_mut(),
44+
msg_namelen: 0,
45+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
46+
msg_iovlen: buffers.len() as _,
47+
msg_control: std::ptr::null_mut(),
48+
msg_controllen: 0,
49+
msg_flags: 0,
50+
};
51+
assert_eq!(26, unsafe {
52+
libc::recvmsg(socket.as_raw_fd(), &mut msg, 0)
53+
});
54+
eprintln!(
55+
"Server Received Message: {} {}",
56+
String::from_utf8_lossy(&buffer1),
57+
String::from_utf8_lossy(&buffer2)
58+
);
59+
assert_eq!(512, unsafe { libc::sendmsg(socket.as_raw_fd(), &msg, 0) });
60+
eprintln!("Server Send Message");
61+
}
3762
println!("Server Shutdown Write");
3863
if socket.shutdown(Shutdown::Write).is_ok() {
3964
println!("Server Closed Connection");
@@ -83,6 +108,37 @@ pub fn start_co_client<A: ToSocketAddrs>(addr: A) {
83108
String::from_utf8_lossy(&buffer2)
84109
);
85110
}
111+
#[cfg(unix)]
112+
for i in 0..3 {
113+
let mut request1 = format!("MessagePart{i}1").into_bytes();
114+
let mut request2 = format!("MessagePart{i}2").into_bytes();
115+
let mut buffers = [
116+
IoSliceMut::new(request1.as_mut_slice()),
117+
IoSliceMut::new(request2.as_mut_slice()),
118+
];
119+
let mut msg = libc::msghdr {
120+
msg_name: std::ptr::null_mut(),
121+
msg_namelen: 0,
122+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
123+
msg_iovlen: buffers.len() as _,
124+
msg_control: std::ptr::null_mut(),
125+
msg_controllen: 0,
126+
msg_flags: 0,
127+
};
128+
assert_eq!(26, unsafe { libc::sendmsg(stream.as_raw_fd(), &msg, 0) });
129+
eprintln!("Client Send Message");
130+
buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
131+
msg.msg_iov = buffers.as_mut_ptr().cast::<libc::iovec>();
132+
msg.msg_iovlen = buffers.len() as _;
133+
assert_eq!(512, unsafe {
134+
libc::recvmsg(stream.as_raw_fd(), &mut msg, 0)
135+
});
136+
eprintln!(
137+
"Client Received Message: {}{}",
138+
String::from_utf8_lossy(&buffer1),
139+
String::from_utf8_lossy(&buffer2)
140+
);
141+
}
86142
println!("Client Shutdown Write");
87143
stream.shutdown(Shutdown::Write).expect("shutdown failed");
88144
println!("Client Closed");

open-coroutine/examples/socket_co_server.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use open_coroutine::task;
22
use std::io::{Error, ErrorKind, IoSlice, IoSliceMut, Read, Write};
33
use std::net::{Shutdown, TcpListener, ToSocketAddrs};
4+
#[cfg(unix)]
5+
use std::os::fd::AsRawFd;
46
use std::sync::{Arc, Condvar, Mutex};
57
use std::time::Duration;
68

@@ -36,6 +38,30 @@ pub fn start_co_server<A: ToSocketAddrs>(addr: A, server_finished: Arc<(Mutex<bo
3638
);
3739
println!("Server Send Multiple");
3840
}
41+
#[cfg(unix)]
42+
for _ in 0..3 {
43+
let mut buffers =
44+
[IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
45+
let mut msg = libc::msghdr {
46+
msg_name: std::ptr::null_mut(),
47+
msg_namelen: 0,
48+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
49+
msg_iovlen: buffers.len() as _,
50+
msg_control: std::ptr::null_mut(),
51+
msg_controllen: 0,
52+
msg_flags: 0,
53+
};
54+
assert_eq!(26, unsafe {
55+
libc::recvmsg(socket.as_raw_fd(), &mut msg, 0)
56+
});
57+
eprintln!(
58+
"Server Received Message: {} {}",
59+
String::from_utf8_lossy(&buffer1),
60+
String::from_utf8_lossy(&buffer2)
61+
);
62+
assert_eq!(512, unsafe { libc::sendmsg(socket.as_raw_fd(), &msg, 0) });
63+
eprintln!("Server Send Message");
64+
}
3965
println!("Server Shutdown Write");
4066
if socket.shutdown(Shutdown::Write).is_ok() {
4167
println!("Server Closed Connection");
@@ -87,6 +113,37 @@ pub fn start_client<A: ToSocketAddrs>(addr: A) {
87113
String::from_utf8_lossy(&buffer2)
88114
);
89115
}
116+
#[cfg(unix)]
117+
for i in 0..3 {
118+
let mut request1 = format!("MessagePart{i}1").into_bytes();
119+
let mut request2 = format!("MessagePart{i}2").into_bytes();
120+
let mut buffers = [
121+
IoSliceMut::new(request1.as_mut_slice()),
122+
IoSliceMut::new(request2.as_mut_slice()),
123+
];
124+
let mut msg = libc::msghdr {
125+
msg_name: std::ptr::null_mut(),
126+
msg_namelen: 0,
127+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
128+
msg_iovlen: buffers.len() as _,
129+
msg_control: std::ptr::null_mut(),
130+
msg_controllen: 0,
131+
msg_flags: 0,
132+
};
133+
assert_eq!(26, unsafe { libc::sendmsg(stream.as_raw_fd(), &msg, 0) });
134+
eprintln!("Client Send Message");
135+
buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
136+
msg.msg_iov = buffers.as_mut_ptr().cast::<libc::iovec>();
137+
msg.msg_iovlen = buffers.len() as _;
138+
assert_eq!(512, unsafe {
139+
libc::recvmsg(stream.as_raw_fd(), &mut msg, 0)
140+
});
141+
eprintln!(
142+
"Client Received Message: {}{}",
143+
String::from_utf8_lossy(&buffer1),
144+
String::from_utf8_lossy(&buffer2)
145+
);
146+
}
90147
println!("Client Shutdown Write");
91148
stream.shutdown(Shutdown::Write).expect("shutdown failed");
92149
println!("Client Closed");

open-coroutine/examples/socket_not_co.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::io::{Error, ErrorKind, IoSlice, IoSliceMut, Read, Write};
22
use std::net::{Shutdown, TcpListener, ToSocketAddrs};
3+
#[cfg(unix)]
4+
use std::os::fd::AsRawFd;
35
use std::sync::{Arc, Condvar, Mutex};
46
use std::time::Duration;
57

@@ -33,6 +35,29 @@ fn start_server<A: ToSocketAddrs>(addr: A, server_finished: Arc<(Mutex<bool>, Co
3335
);
3436
eprintln!("Server Send Multiple");
3537
}
38+
#[cfg(unix)]
39+
for _ in 0..3 {
40+
let mut buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
41+
let mut msg = libc::msghdr {
42+
msg_name: std::ptr::null_mut(),
43+
msg_namelen: 0,
44+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
45+
msg_iovlen: buffers.len() as _,
46+
msg_control: std::ptr::null_mut(),
47+
msg_controllen: 0,
48+
msg_flags: 0,
49+
};
50+
assert_eq!(26, unsafe {
51+
libc::recvmsg(socket.as_raw_fd(), &mut msg, 0)
52+
});
53+
eprintln!(
54+
"Server Received Message: {} {}",
55+
String::from_utf8_lossy(&buffer1),
56+
String::from_utf8_lossy(&buffer2)
57+
);
58+
assert_eq!(512, unsafe { libc::sendmsg(socket.as_raw_fd(), &msg, 0) });
59+
eprintln!("Server Send Message");
60+
}
3661
eprintln!("Server Shutdown Write");
3762
if socket.shutdown(Shutdown::Write).is_ok() {
3863
eprintln!("Server Closed Connection");
@@ -82,6 +107,37 @@ fn start_client<A: ToSocketAddrs>(addr: A) {
82107
String::from_utf8_lossy(&buffer2)
83108
);
84109
}
110+
#[cfg(unix)]
111+
for i in 0..3 {
112+
let mut request1 = format!("MessagePart{i}1").into_bytes();
113+
let mut request2 = format!("MessagePart{i}2").into_bytes();
114+
let mut buffers = [
115+
IoSliceMut::new(request1.as_mut_slice()),
116+
IoSliceMut::new(request2.as_mut_slice()),
117+
];
118+
let mut msg = libc::msghdr {
119+
msg_name: std::ptr::null_mut(),
120+
msg_namelen: 0,
121+
msg_iov: buffers.as_mut_ptr().cast::<libc::iovec>(),
122+
msg_iovlen: buffers.len() as _,
123+
msg_control: std::ptr::null_mut(),
124+
msg_controllen: 0,
125+
msg_flags: 0,
126+
};
127+
assert_eq!(26, unsafe { libc::sendmsg(stream.as_raw_fd(), &msg, 0) });
128+
eprintln!("Client Send Message");
129+
buffers = [IoSliceMut::new(&mut buffer1), IoSliceMut::new(&mut buffer2)];
130+
msg.msg_iov = buffers.as_mut_ptr().cast::<libc::iovec>();
131+
msg.msg_iovlen = buffers.len() as _;
132+
assert_eq!(512, unsafe {
133+
libc::recvmsg(stream.as_raw_fd(), &mut msg, 0)
134+
});
135+
eprintln!(
136+
"Client Received Message: {}{}",
137+
String::from_utf8_lossy(&buffer1),
138+
String::from_utf8_lossy(&buffer2)
139+
);
140+
}
85141
eprintln!("Client Shutdown Write");
86142
stream.shutdown(Shutdown::Write).expect("shutdown failed");
87143
eprintln!("Client Closed");

0 commit comments

Comments
 (0)