safecoin_client/
udp_client.rs

1//! Simple TPU client that communicates with the given UDP port with UDP and provides
2//! an interface for sending transactions
3
4use {
5    crate::{connection_cache::ConnectionCacheStats, tpu_connection::TpuConnection},
6    core::iter::repeat,
7    solana_sdk::transport::Result as TransportResult,
8    solana_streamer::sendmmsg::batch_send,
9    std::{
10        net::{SocketAddr, UdpSocket},
11        sync::Arc,
12    },
13};
14
15pub struct UdpTpuConnection {
16    socket: Arc<UdpSocket>,
17    addr: SocketAddr,
18}
19
20impl UdpTpuConnection {
21    pub fn new_from_addr(local_socket: Arc<UdpSocket>, tpu_addr: SocketAddr) -> Self {
22        Self {
23            socket: local_socket,
24            addr: tpu_addr,
25        }
26    }
27
28    pub fn new(
29        local_socket: Arc<UdpSocket>,
30        tpu_addr: SocketAddr,
31        _connection_stats: Arc<ConnectionCacheStats>,
32    ) -> Self {
33        Self::new_from_addr(local_socket, tpu_addr)
34    }
35}
36
37impl TpuConnection for UdpTpuConnection {
38    fn tpu_addr(&self) -> &SocketAddr {
39        &self.addr
40    }
41
42    fn send_wire_transaction_async(&self, wire_transaction: Vec<u8>) -> TransportResult<()> {
43        self.socket.send_to(wire_transaction.as_ref(), self.addr)?;
44        Ok(())
45    }
46
47    fn send_wire_transaction_batch<T>(&self, buffers: &[T]) -> TransportResult<()>
48    where
49        T: AsRef<[u8]> + Send + Sync,
50    {
51        let pkts: Vec<_> = buffers.iter().zip(repeat(self.tpu_addr())).collect();
52        batch_send(&self.socket, &pkts)?;
53        Ok(())
54    }
55
56    fn send_wire_transaction_batch_async(&self, buffers: Vec<Vec<u8>>) -> TransportResult<()> {
57        let pkts: Vec<_> = buffers.into_iter().zip(repeat(self.tpu_addr())).collect();
58        batch_send(&self.socket, &pkts)?;
59        Ok(())
60    }
61}