#[tokio::test] asyncfn peek_sender() -> std::io::Result<()> { let sender = UdpSocket::bind("127.0.0.1:0").await?; let receiver = UdpSocket::bind("127.0.0.1:0").await?;
let sender_addr = sender.local_addr()?; let receiver_addr = receiver.local_addr()?;
let msg = b"Hello, world!";
sender.send_to(msg, receiver_addr).await?;
let peeked_sender = receiver.peek_sender().await?;
assert_eq!(peeked_sender, sender_addr);
// Assert that `peek_sender()` returns the right sender but // doesn't remove from the receive queue. letmut recv_buf = [0u8; 32]; let (read, received_sender) = receiver.recv_from(&mut recv_buf).await?;
#[tokio::test] asyncfn poll_peek_sender() -> std::io::Result<()> { let sender = UdpSocket::bind("127.0.0.1:0").await?; let receiver = UdpSocket::bind("127.0.0.1:0").await?;
let sender_addr = sender.local_addr()?; let receiver_addr = receiver.local_addr()?;
let msg = b"Hello, world!";
poll_fn(|cx| sender.poll_send_to(cx, msg, receiver_addr)).await?;
let peeked_sender = poll_fn(|cx| receiver.poll_peek_sender(cx)).await?;
assert_eq!(peeked_sender, sender_addr);
// Assert that `poll_peek_sender()` returns the right sender but // doesn't remove from the receive queue. letmut recv_buf = [0u8; 32]; letmut read = ReadBuf::new(&mut recv_buf); let received_sender = poll_fn(|cx| receiver.poll_recv_from(cx, &>mut read)).await?;
#[tokio::test] asyncfn try_peek_sender() -> std::io::Result<()> { let sender = UdpSocket::bind("127.0.0.1:0").await?; let receiver = UdpSocket::bind("127.0.0.1:0").await?;
let sender_addr = sender.local_addr()?; let receiver_addr = receiver.local_addr()?;
let msg = b"Hello, world!";
sender.send_to(msg, receiver_addr).await?;
let peeked_sender = loop { match receiver.try_peek_sender() {
Ok(peeked_sender) => break peeked_sender,
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
receiver.readable().await?;
}
Err(e) => return Err(e),
}
};
assert_eq!(peeked_sender, sender_addr);
// Assert that `try_peek_sender()` returns the right sender but // didn't remove from the receive queue. letmut recv_buf = [0u8; 32]; // We already peeked the sender so there must be data in the receive queue. let (read, received_sender) = receiver.try_recv_from(&mut recv_buf).unwrap();
#[tokio::test] asyncfn split() -> std::io::Result<()> { let socket = UdpSocket::bind("127.0.0.1:0").await?; let s = Arc::new(socket); let r = s.clone();
#[tokio::test] asyncfn split_chan() -> std::io::Result<()> { // setup UdpSocket that will echo all sent items let socket = UdpSocket::bind("127.0.0.1:0").await?; let addr = socket.local_addr().unwrap(); let s = Arc::new(socket); let r = s.clone();
// test that we can send a value and get back some response let sender = UdpSocket::bind("127.0.0.1:0").await?;
sender.send_to(MSG, addr).await?; letmut recv_buf = [0u8; 32]; let (len, _) = sender.recv_from(&mut recv_buf).await?;
assert_eq!(&recv_buf[..len], MSG);
Ok(())
}
#[tokio::test] asyncfn split_chan_poll() -> std::io::Result<()> { // setup UdpSocket that will echo all sent items let socket = UdpSocket::bind("127.0.0.1:0").await?; let addr = socket.local_addr().unwrap(); let s = Arc::new(socket); let r = s.clone();
// test that we can send a value and get back some response let sender = UdpSocket::bind("127.0.0.1:0").await?;
poll_fn(|cx| sender.poll_send_to(cx, MSG, addr)).await?;
// # Note // // This test is purposely written such that each time `sender` sends data on // the socket, `receiver` awaits the data. On Unix, it would be okay waiting // until the end of the test to receive all the data. On Windows, this would // **not** be okay because it's resources are completion based (via IOCP). // If data is sent and not yet received, attempting to send more data will // result in `ErrorKind::WouldBlock` until the first operation completes. #[tokio::test] asyncfn try_send_spawn() { const MSG2: &[u8] = b"world!"; const MSG2_LEN: usize = MSG2.len();
let sender = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let receiver = UdpSocket::bind("127.0.0.1:0").await.unwrap();
let sent = &sender
.try_send_to(MSG, receiver.local_addr().unwrap())
.unwrap();
assert_eq!(sent, &MSG_LEN); letmut buf = [0u8; 32]; letmut received = receiver.recv(&mut buf[..]).await.unwrap();
sender
.connect(receiver.local_addr().unwrap())
.await
.unwrap(); let sent = &sender.try_send(MSG2).unwrap();
assert_eq!(sent, &MSG2_LEN);
received += receiver.recv(&mut buf[..]).await.unwrap();
std::thread::spawn(move || { let sent = &sender.try_send(MSG).unwrap();
assert_eq!(sent, &MSG_LEN);
})
.join()
.unwrap();
received += receiver.recv(&mut buf[..]).await.unwrap();
assert_eq!(received, MSG_LEN * 2 + MSG2_LEN);
}
#[tokio::test] asyncfn try_send_recv() { // Create listener let server = UdpSocket::bind("127.0.0.1:0").await.unwrap();
// Create socket pair let client = UdpSocket::bind("127.0.0.1:0").await.unwrap();
// Connect the two
client.connect(server.local_addr().unwrap()).await.unwrap();
server.connect(client.local_addr().unwrap()).await.unwrap();
for _ in0..5 { loop {
client.writable().await.unwrap();
#[tokio::test] asyncfn try_send_to_recv_from() { // Create listener let server = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let saddr = server.local_addr().unwrap();
// Create socket pair let client = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let caddr = client.local_addr().unwrap();
for _ in0..5 { loop {
client.writable().await.unwrap();
#[tokio::test] asyncfn try_recv_buf_from() { // Create listener let server = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let saddr = server.local_addr().unwrap();
// Create socket pair let client = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let caddr = client.local_addr().unwrap();
for _ in0..5 { loop {
client.writable().await.unwrap();
#[tokio::test] asyncfn poll_ready() { // Create listener let server = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let saddr = server.local_addr().unwrap();
// Create socket pair let client = UdpSocket::bind("127.0.0.1:0").await.unwrap(); let caddr = client.local_addr().unwrap();
for _ in0..5 { loop {
assert_ok!(poll_fn(|cx| client.poll_send_ready(cx)).await);
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.