4 releases
| 0.2.5 | Jun 26, 2023 |
|---|---|
| 0.2.4 | Nov 29, 2022 |
| 0.2.3 | Sep 2, 2022 |
| 0.2.2 | Aug 26, 2022 |
| 0.1.0 |
|
#550 in Operating systems
5,281 downloads per month
Used in 27 crates
(14 directly)
33KB
492 lines
os_socketaddr
This crate provides a type that can act as a platform-native socket address
(i.e. libc::sockaddr)
Motivation
The std crate provides SocketAddr for managing socket addresses. However there is no easy way to
convert SocketAddr from/into a libc::sockaddr because SocketAddr has a different internal
layout.
This crate provides OsSocketAddr which holds a libc::sockaddr (containing an IPv4 or IPv6
address) and the conversion functions:
- from/into
SocketAddr - from
(*const sockaddr, socklen_t) - into
(*mut sockaddr, *mut socklen_t)
Supported targets #[cfg(target_os="xxxxxx")]
linux, macos and windows are officially supported and
actively tested.
android, dragonfly, emscripten, freebsd, fuchsia, haiku, hermit, illumos, ios,
l4re, netbsd, openbsd, redox, solaris, vxworks and watchos should work but are not
tested.
Example
extern crate libc;
extern crate os_socketaddr;
use std::net::SocketAddr;
use libc::{c_int, c_void, size_t, ssize_t};
use os_socketaddr::OsSocketAddr;
fn sendto(socket: c_int, payload: &[u8], dst: SocketAddr) -> ssize_t
{
let addr : OsSocketAddr = dst.into();
unsafe {
libc::sendto(socket, payload.as_ptr() as *const c_void, payload.len() as size_t, 0,
addr.as_ptr(), addr.len())
}
}
fn recvfrom(socket: c_int, payload: &mut[u8]) -> (ssize_t, Option<SocketAddr>)
{
let mut addr = OsSocketAddr::new();
let mut addrlen = addr.capacity();
let nb = unsafe {
libc::recvfrom(socket, payload.as_mut_ptr() as *mut c_void, payload.len(), 0,
addr.as_mut_ptr(), &mut addrlen as *mut _)
};
(nb, addr.into())
}
Dependencies
~215KB