#socket-address #libc #sockets #api-bindings

os_socketaddr

处理平台原生套接字地址(struct sockaddr)的类型

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 2018年4月28日

网络编程中排名第226位

Download history 3076/week @ 2024-03-14 2587/week @ 2024-03-21 1243/week @ 2024-03-28 1570/week @ 2024-04-04 1663/week @ 2024-04-11 1611/week @ 2024-04-18 1454/week @ 2024-04-25 1332/week @ 2024-05-02 984/week @ 2024-05-09 1229/week @ 2024-05-16 2110/week @ 2024-05-23 1441/week @ 2024-05-30 1395/week @ 2024-06-06 1397/week @ 2024-06-13 1243/week @ 2024-06-20 1072/week @ 2024-06-27

每月下载量5,324
用于21个Crates(直接使用10个)

MIT/Apache

33KB
492

os_socketaddr

Crates.io License: Mit or Apache 2.0 Build Status

此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")]

linuxmacoswindows官方支持,并且积极测试

androiddragonflyemscriptenfreebsdfuchsiahaikuhermitillumosiosl4renetbsdopenbsdredoxsolarisvxworkswatchos 应该可以工作,但尚未经过测试。

示例

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