use std::time::Duration; use tokio::net::TcpSocket; use tokio_test::assert_ok;
#[tokio::test] asyncfn basic_usage_v4() { // Create server let addr = assert_ok!("127.0.0.1:0".parse()); let srv = assert_ok!(TcpSocket::new_v4());
assert_ok!(srv.bind(addr));
let srv = assert_ok!(srv.listen(128));
// Create client & connect let addr = srv.local_addr().unwrap(); let cli = assert_ok!(TcpSocket::new_v4()); let _cli = assert_ok!(cli.connect(addr).await);
// Accept let _ = assert_ok!(srv.accept().await);
}
#[tokio::test] asyncfn basic_usage_v6() { // Create server let addr = assert_ok!("[::1]:0".parse()); let srv = assert_ok!(TcpSocket::new_v6());
assert_ok!(srv.bind(addr));
let srv = assert_ok!(srv.listen(128));
// Create client & connect let addr = srv.local_addr().unwrap(); let cli = assert_ok!(TcpSocket::new_v6()); let _cli = assert_ok!(cli.connect(addr).await);
// Accept let _ = assert_ok!(srv.accept().await);
}
#[tokio::test] asyncfn bind_before_connect() { // Create server let any_addr = assert_ok!("127.0.0.1:0".parse()); let srv = assert_ok!(TcpSocket::new_v4());
assert_ok!(srv.bind(any_addr));
let srv = assert_ok!(srv.listen(128));
// Create client & connect let addr = srv.local_addr().unwrap(); let cli = assert_ok!(TcpSocket::new_v4());
assert_ok!(cli.bind(any_addr)); let _cli = assert_ok!(cli.connect(addr).await);
// Accept let _ = assert_ok!(srv.accept().await);
}
#[cfg_attr(target_os = "wasi", ignore = "WASI does not yet support `SO_LINGER`")] #[tokio::test] asyncfn basic_linger() { // Create server let addr = assert_ok!("127.0.0.1:0".parse()); let srv = assert_ok!(TcpSocket::new_v4());
assert_ok!(srv.bind(addr));
/// Macro to create a simple test to set and get a socket option.
macro_rules! test { // Test using the `arg`ument as expected return value.
($( #[ $attr: meta ] )* $get_fn: ident, $set_fn: ident ( $arg: expr ) ) => {
test!($( #[$attr] )* $get_fn, $set_fn($arg), $arg);
};
($( #[ $attr: meta ] )* $get_fn: ident, $set_fn: ident ( $arg: expr ), $expected: expr ) => { #[test]
$( #[$attr] )* fn $get_fn() {
test!(__ new_v4, $get_fn, $set_fn($arg), $expected); #[cfg(not(target_os = "vita"))]
test!(__ new_v6, $get_fn, $set_fn($arg), $expected);
}
}; // Only test using a IPv4 socket.
(IPv4 $get_fn: ident, $set_fn: ident ( $arg: expr ) ) => { #[test] fn $get_fn() {
test!(__ new_v4, $get_fn, $set_fn($arg), $arg);
}
}; // Only test using a IPv6 socket.
(IPv6 $get_fn: ident, $set_fn: ident ( $arg: expr ) ) => { #[test] fn $get_fn() {
test!(__ new_v6, $get_fn, $set_fn($arg), $arg);
}
};
// Internal to this macro.
(__ $constructor: ident, $get_fn: ident, $set_fn: ident ( $arg: expr ), $expected: expr ) => { let socket = TcpSocket::$constructor().expect("failed to create `TcpSocket`");
let initial = socket.$get_fn().expect("failed to get initial value"); let arg = $arg;
assert_ne!(initial, arg, "initial value and argument are the same");
socket.$set_fn(arg).expect("failed to set option"); let got = socket.$get_fn().expect("failed to get value"); let expected = $expected;
assert_eq!(got, expected, "set and get values differ");
};
}
const SET_BUF_SIZE: u32 = 4096; // Linux doubles the buffer size for kernel usage, and exposes that when // retrieving the buffer size.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.