2023-02-01 18:10:06 -08:00
|
|
|
//! Simple client that communicates with the given UDP port with UDP and provides
|
|
|
|
//! an interface for sending data
|
2022-09-30 18:51:50 -07:00
|
|
|
|
2022-11-18 11:21:45 -08:00
|
|
|
use {
|
|
|
|
core::iter::repeat,
|
2023-02-01 18:10:06 -08:00
|
|
|
solana_connection_cache::client_connection::ClientConnection,
|
2022-11-18 11:21:45 -08:00
|
|
|
solana_sdk::transport::Result as TransportResult,
|
|
|
|
solana_streamer::sendmmsg::batch_send,
|
|
|
|
std::{
|
|
|
|
net::{SocketAddr, UdpSocket},
|
|
|
|
sync::Arc,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
pub struct UdpClientConnection {
|
2022-11-18 11:21:45 -08:00
|
|
|
pub socket: Arc<UdpSocket>,
|
|
|
|
pub addr: SocketAddr,
|
|
|
|
}
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
impl UdpClientConnection {
|
|
|
|
pub fn new_from_addr(local_socket: Arc<UdpSocket>, server_addr: SocketAddr) -> Self {
|
2022-11-18 11:21:45 -08:00
|
|
|
Self {
|
|
|
|
socket: local_socket,
|
2023-02-01 18:10:06 -08:00
|
|
|
addr: server_addr,
|
2022-11-18 11:21:45 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
impl ClientConnection for UdpClientConnection {
|
|
|
|
fn server_addr(&self) -> &SocketAddr {
|
2022-11-18 11:21:45 -08:00
|
|
|
&self.addr
|
|
|
|
}
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
fn send_data_async(&self, data: Vec<u8>) -> TransportResult<()> {
|
|
|
|
self.socket.send_to(data.as_ref(), self.addr)?;
|
2022-11-18 11:21:45 -08:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
fn send_data_batch(&self, buffers: &[Vec<u8>]) -> TransportResult<()> {
|
|
|
|
let pkts: Vec<_> = buffers.iter().zip(repeat(self.server_addr())).collect();
|
2022-11-18 11:21:45 -08:00
|
|
|
batch_send(&self.socket, &pkts)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2023-02-01 18:10:06 -08:00
|
|
|
fn send_data_batch_async(&self, buffers: Vec<Vec<u8>>) -> TransportResult<()> {
|
|
|
|
let pkts: Vec<_> = buffers
|
|
|
|
.into_iter()
|
|
|
|
.zip(repeat(self.server_addr()))
|
|
|
|
.collect();
|
2022-11-18 11:21:45 -08:00
|
|
|
batch_send(&self.socket, &pkts)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
2023-02-01 18:10:06 -08:00
|
|
|
|
|
|
|
fn send_data(&self, buffer: &[u8]) -> TransportResult<()> {
|
|
|
|
self.socket.send_to(buffer, self.addr)?;
|
|
|
|
Ok(())
|
|
|
|
}
|
2022-11-18 11:21:45 -08:00
|
|
|
}
|