4个版本
| 0.2.5 | 2023年6月26日 |
|---|---|
| 0.2.4 | 2022年11月29日 |
| 0.2.3 | 2022年9月2日 |
| 0.2.2 | 2022年8月26日 |
| 0.1.0 |
|
在网络编程中排名第226位
每月下载量5,324
用于21个Crates(直接使用10个)
33KB
492 行
os_socketaddr
此crate提供了一个可以作为平台原生套接字地址(即 libc::sockaddr)的类型
动机
std crate提供了SocketAddr来管理套接字地址。然而,由于SocketAddr内部布局不同,没有简单的方法将SocketAddr从/转换为libc::sockaddr。
此crate提供了OsSocketAddr,它包含一个libc::sockaddr(包含IPv4或IPv6地址)和转换函数
- 从/到
SocketAddr - 从
(*const sockaddr, socklen_t) - 到
(*mut sockaddr, *mut socklen_t)
支持的目标 #[cfg(target_os="xxxxxx")]
linux、macos和windows官方支持,并且积极测试。
android、dragonfly、emscripten、freebsd、fuchsia、haiku、hermit、illumos、ios、l4re、netbsd、openbsd、redox、solaris、vxworks 和 watchos 应该可以工作,但尚未经过测试。
示例
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())
}
依赖项
~215KB