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