Skip to content

Commit

Permalink
Use connected UDP sockets
Browse files Browse the repository at this point in the history
  • Loading branch information
dvolodin7 committed Jan 10, 2024
1 parent 5df3ce9 commit 053aaac
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
7 changes: 6 additions & 1 deletion src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

use pyo3::{
create_exception,
exceptions::{PyBlockingIOError, PyException, PyNotImplementedError, PyOSError},
exceptions::{
PyBlockingIOError, PyException, PyNotImplementedError, PyOSError, PyTimeoutError,
},
PyErr,
};

Expand Down Expand Up @@ -41,6 +43,8 @@ pub enum SnmpError {
SocketError(String),
/// Blocking operation
WouldBlock,
/// Connection refused
ConnectionRefused,
}

impl From<nom::Err<SnmpError>> for SnmpError {
Expand Down Expand Up @@ -105,6 +109,7 @@ impl From<SnmpError> for PyErr {
SnmpError::NoSuchInstance => PyNoSuchInstance::new_err("no such instance"),
SnmpError::WouldBlock => PyBlockingIOError::new_err("blocked"),
SnmpError::SocketError(x) => PyOSError::new_err(x),
SnmpError::ConnectionRefused => PyTimeoutError::new_err("connection refused"),
}
}
}
16 changes: 10 additions & 6 deletions src/socket/transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@
use crate::ber::BerEncoder;
use crate::buf::Buffer;
use crate::error::SnmpError;
use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use socket2::{Domain, Protocol, Socket, Type};
use std::net::SocketAddr;
use std::os::fd::{AsRawFd, RawFd};

pub struct SnmpTransport {
io: Socket,
addr: SockAddr,
buf: Buffer,
}

Expand Down Expand Up @@ -52,10 +51,12 @@ impl SnmpTransport {
if recv_buffer_size > 0 {
Self::set_recv_buffer_size(&io, recv_buffer_size)?;
}
// Make socket connected
io.connect(&sock_addr.into())
.map_err(|e| SnmpError::SocketError(e.to_string()))?;
//
Ok(Self {
io,
addr: sock_addr.into(),
buf: Buffer::default(),
})
}
Expand All @@ -68,7 +69,7 @@ impl SnmpTransport {
msg.push_ber(&mut self.buf)?;
// Send
self.io
.send_to(self.buf.data(), &self.addr)
.send(self.buf.data())
.map_err(|e| SnmpError::SocketError(e.to_string()))?;
Ok(())
}
Expand All @@ -78,11 +79,14 @@ impl SnmpTransport {
T: TryFrom<&'a [u8], Error = SnmpError>,
'b: 'a,
{
let size = match self.io.recv_from(self.buf.as_mut()) {
Ok((s, _)) => s,
let size = match self.io.recv(self.buf.as_mut()) {
Ok(s) => s,
Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {
return Err(SnmpError::WouldBlock)
}
Err(e) if e.kind() == std::io::ErrorKind::ConnectionRefused => {
return Err(SnmpError::ConnectionRefused)
}
Err(e) => return Err(SnmpError::SocketError(e.to_string())),
};
// Parse response
Expand Down

0 comments on commit 053aaac

Please sign in to comment.