solana_udp_client/
udp_client.rs

1//! Simple client that communicates with the given UDP port with UDP and provides
2//! an interface for sending data
3
4use {
5    core::iter::repeat,
6    solana_connection_cache::client_connection::ClientConnection,
7    solana_streamer::sendmmsg::batch_send,
8    solana_transaction_error::TransportResult,
9    std::{
10        net::{SocketAddr, UdpSocket},
11        sync::Arc,
12    },
13};
14
15pub struct UdpClientConnection {
16    pub socket: Arc<UdpSocket>,
17    pub addr: SocketAddr,
18}
19
20impl UdpClientConnection {
21    pub fn new_from_addr(local_socket: Arc<UdpSocket>, server_addr: SocketAddr) -> Self {
22        Self {
23            socket: local_socket,
24            addr: server_addr,
25        }
26    }
27}
28
29impl ClientConnection for UdpClientConnection {
30    fn server_addr(&self) -> &SocketAddr {
31        &self.addr
32    }
33
34    fn send_data_async(&self, data: Vec<u8>) -> TransportResult<()> {
35        self.socket.send_to(data.as_ref(), self.addr)?;
36        Ok(())
37    }
38
39    fn send_data_batch(&self, buffers: &[Vec<u8>]) -> TransportResult<()> {
40        let pkts: Vec<_> = buffers.iter().zip(repeat(self.server_addr())).collect();
41        batch_send(&self.socket, &pkts)?;
42        Ok(())
43    }
44
45    fn send_data_batch_async(&self, buffers: Vec<Vec<u8>>) -> TransportResult<()> {
46        let pkts: Vec<_> = buffers
47            .into_iter()
48            .zip(repeat(self.server_addr()))
49            .collect();
50        batch_send(&self.socket, &pkts)?;
51        Ok(())
52    }
53
54    fn send_data(&self, buffer: &[u8]) -> TransportResult<()> {
55        self.socket.send_to(buffer, self.addr)?;
56        Ok(())
57    }
58}