solana_udp_client/
udp_client.rs1use {
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}